Fluent 断言 PropertyInfo BeDecoratedWith

Posted

技术标签:

【中文标题】Fluent 断言 PropertyInfo BeDecoratedWith【英文标题】:Fluent Assertions PropertyInfo BeDecoratedWith 【发布时间】:2013-09-12 07:33:54 【问题描述】:

.NET FluentAssertions 库(版本 2.1.0)有几个 BeDecoratedWith<T>() 实现,用于断言类型(或类型成员)具有应用于它的给定属性。这些调用如下所示:

typeof(X).Should()
    .BeDecoratedWith<SomeAttribute>(attr => attr.Name == expectedValue);

lambda 表达式断言该属性的 Name 等于某些 expectedValue

sut 是一个类型时,这很好,但是当它是一个成员时,没有BeDecoratedWith&lt;T&gt; 的重载接受一个lambda 表达式。

// compiler error: Cannot convert lambda expression to type 'string' because it is not a delegate type
typeof(X).GetProperty("xyz").Should()
    .BeDecoratedWith<SomeAttribute>(attr => attr.Name == expectedValue);

该文档很快涵盖了extensibility,但我无法弄清楚如何在PropertyInfoAssertions 类上创建BeDecoratedWith&lt;T&gt; 的重载(或扩展方法),该类接受类似于上述的lambda。

有人可以告诉我扩展 Fluent Assertions 以实现此目的的正确方法吗?

【问题讨论】:

那么,您有什么特别的问题吗? 扩展库的最佳方式。看起来我可以扩展ProprtyInfoAssertions,但是我必须自己重新编写所有属性处理代码,这似乎是错误的。 好的,现在我明白问题所在了。 【参考方案1】:

你有两个选择:

    在 PropertyInfoAssertions 上创建一个支持 lambda 表达式并使用 SubjectProperties 属性访问实际属性的扩展方法。 fork GitHub 上的存储库并将其直接添加到框架中。我会接受拉取请求。

【讨论】:

好的,看来我需要分叉代码才能“正确”地做到这一点。谢谢指点。 不,您不必这样做。您仍然可以使用选项 1。如果您希望我将其包含在 2.2 中,您只需要选项 2。【参考方案2】:

一个可能的答案是稍等片刻,然后获取最新版本,因为这个问题最近似乎已经解决了:)

http://fluentassertions.codeplex.com/workitem/12455

【讨论】:

这不能解决我的问题。我正在使用该代码,但希望它做得更多。

以上是关于Fluent 断言 PropertyInfo BeDecoratedWith的主要内容,如果未能解决你的问题,请参考以下文章

C# fluent 断言检查结果为 bool

Fluent Assertions - null 和空字符串比较 [关闭]

Fluent 断言命名空间无法识别

在 Fluent 断言中排除未初始化 (null) 的属性

将枚举与自定义 Fluent 断言等效步骤进行比较

如果使用 Fluent Assertions 的顺序不同,如何断言两个列表不等价