使用 Fluent Assertions 库的多个断言

Posted

技术标签:

【中文标题】使用 Fluent Assertions 库的多个断言【英文标题】:Multiple assertions using Fluent Assertions library 【发布时间】:2018-02-07 13:13:29 【问题描述】:

Fluent Assertions 似乎在 NUnit 的 Assert.Multiple 块中不起作用:

Assert.Multiple(() =>
    
        1.Should().Be(2);
        3.Should().Be(4);
    );

运行此代码时,在第一个断言之后测试立即失败,因此甚至不执行第二个断言。

但是,如果我使用 NUnit 的原生断言,我会得到我想要的结果:

Assert.Multiple(() =>
    
        Assert.That(1, Is.EqualTo(2));
        Assert.That(3, Is.EqualTo(4));
    );

输出包含两个失败的详细信息:

测试失败 - ExampleTest()

消息: 预计:2 但是是:1

测试失败 - ExampleTest()

消息: 预计:4 但是是:3

如何使用 Fluent Assertions 和 NUnit 获得类似的结果?

【问题讨论】:

【参考方案1】:

您可以像这样使用assertion scopes 执行此操作:

using (new AssertionScope())

    5.Should().Be(10);
    "Actual".Should().Be("Expected");

【讨论】:

@DennisDomen 在他对原始答案的评论中确实提到了它,但我认为最好也将它作为答案,以防有人错过评论!【参考方案2】:

您可以:

1:使用AssertionScope(由@RonaldMcdonald 指出):

using (new AssertionScope())

  (2 + 2).Should().Be(5);
  (2 + 2).Should().Be(6);

或者:

2。使用FluentAssertions.AssertMultipleNuGet包(自己创建的小包):

AssertMultiple.Multiple(() =>

    (2 + 2).Should().Be(5);
    (2 + 2).Should().Be(6);
);

而且,当你导入静态成员时:

using static FluentAssertions.AssertMultiple.AssertMultiple;

//...

Multiple(() =>

    (2 + 2).Should().Be(5);
    (2 + 2).Should().Be(6);
);

【讨论】:

【参考方案3】:

抱歉,简短的回答是您目前无法使用 Fluent 断言获得相同的结果。 NUnit 断言中有特殊的逻辑,知道它们在多个断言块中。在这种情况下,它们不会在失败时抛出异常,而是将失败注册到父多重断言,它会在完成时报告错误。

Fluent 断言需要在内部做同样的事情。这可以像链接到 NUnit 断言一样简单,甚至只是调用 Assert.Fail。我建议向 Fluent assertions 项目提交问题。如果他们需要有关 NUnit 内部如何工作的帮助,请随时在 GitHub (@rprouse) 上将他们指向我。

【讨论】:

作为参考,FluentAssertions 中的等价物是AssertionScope @DennisDoomen 如果我使用 AssertionScope 并在其中调用两个方法,每个方法都有一个断言,我在测试资源管理器中收到以下消息:预期值为 2,但找到 1。预期值是 4,但找到了 3。我可以自定义此消息吗?例如,在其中包含方法名称,以便我可以看到断言在哪个方法中失败? 这些方法中的每一个,除了一个额外的参数来提供预期结果的原因。

以上是关于使用 Fluent Assertions 库的多个断言的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent Assertions 在不等式测试中测试异常?

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

Fluent-ASsertions ShouldRaisePropertyChangeFor 不适用于异步任务?

Fluent Assertions:大致比较一个类的属性

Fluent Assertions:两个数组列表的等价性,数组需要严格排序

NUnit 或 Fluent Assertions 测试引用是不是相等?