如何在 FluentAssertions 中使用“Which”?

Posted

技术标签:

【中文标题】如何在 FluentAssertions 中使用“Which”?【英文标题】:How to use `Which` in FluentAssertions? 【发布时间】:2021-07-29 02:22:34 【问题描述】:

我正在使用流利的断言并且我有这个测试:

            result.Should().NotBeNull();
            result.Link.Should().Equals("https://someinvoiceurl.com");

效果很好,但是当我尝试这个时

            result.Should().NotBeNull().Which.Link.Equals("https://someinvoiceurl.com");

我收到了这个错误

'AndConstraint<ObjectAssertions>' does not contain a definition for 'Which' and no accessible extension method 'Which' accepting a first argument of type 'AndConstraint<ObjectAssertions>' could be found (are you missing a using directive or an assembly reference?)

我做错了什么?

【问题讨论】:

使用And 而不是Which。前者用于链接。后者是前一个断言改变了被断言对象的类型。 【参考方案1】:

这里的问题是.NotBeNull() 不是通用的(它是ObjectAssertions 而不是GenericObjectAssertions 的扩展),因此它不能将类型信息链接到以后的调用。

我个人认为这是库设计中的一个缺陷,但可以通过将.NotBeNull() 替换为.BeOfType&lt;T&gt;() 来轻松解决:

result.Should().BeOfType<ThingWithLink>() // assertion fails if `result` is null
    .Which.Link.Should().Be("https://someinvoiceurl.com");

当然,如果您经常在 ThingWithLink 类型上断言,那么编写自定义断言可能是值得的,这样您就可以“更流畅”:

result.Should().BeOfType<ThingWithLink>()
    .And.HaveLink("https://someinvoiceurl.com");

如果您需要更特别的东西,您可以随时使用.BeEquivalentTo() 进行结构比较:

result.Should().NotBeNull()
    .And.BeEquivalentTo(new  Link = "https://someinvoiceurl.com" ); // ignores all members on `result` except for `result.Link`

【讨论】:

.BeOfType&lt;T&gt;() 为空会失败吗? 正确:null 没有运行时类型,所以它不能是 T 类型。

以上是关于如何在 FluentAssertions 中使用“Which”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FluentAssertions 在 XUnit 中测试 MediatR 处理程序

如何在 FluentAssertions 中为集合中的属性使用排除?

如何在 FluentAssertions 中使用 Excluding 来排除 Dictionary 中的特定 KeyValue 对

如何使用 FluentAssertions 4.x 版断言异常?

如何使用FluentAssertions在XUnit中测试MediatR处理程序

FluentAssertions:如何在每对元素上使用自定义比较来比较两个集合?