使用Fluent Assertions库的多个断言

时间:2017-08-30 00:00:43

标签: c# nunit assertions nunit-3.0 fluent-assertions

似乎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

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

3 个答案:

答案 0 :(得分:6)

我知道我来晚了,但是我相信这正是您想要的:https://fluentassertions.com/documentation/#assertion-scope

我读过这个问题,想找同样的事情,所以想我会分享。 基本上是这样:

using (new AssertionScope())
{
5.Should().Be(10);
"Actual".Should().Be("Expected");
} 

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

您可以:

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

using (new AssertionScope())
{
  (2 + 2).Should().Be(5);
  (2 + 2).Should().Be(6);
}

或者:

2。使用FluentAssertions.AssertMultiple NuGet程序包(由我自己创建的微型程序包):

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);
});