Несколько утверждений с использованием библиотеки Fluent Assertions

Кажется, что Fluent Assertions не работает в блоке Assert.Multiple NUnit:

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?


person YMM    schedule 30.08.2017    source источник


Ответы (3)


Я знаю, что опаздываю, однако я считаю, что это именно то, что вы искали: https://fluentassertions.com/introduction#assertion-scopes.

Я прочитал этот вопрос в поисках того же самого, поэтому решил поделиться им. В основном это:

using (new AssertionScope())
{
5.Should().Be(10);
"Actual".Should().Be("Expected");
} 
person RonaldMcdonald    schedule 20.07.2018
comment
@DennisDoomen упомянул об этом в своем комментарии к исходному ответу, но я думаю, что было бы неплохо также иметь его в качестве ответа на случай, если кто-то пропустит комментарий! - person Michal Ciechan; 20.07.2018

Извините, короткий ответ: в настоящее время вы не можете получить те же результаты с утверждениями Fluent. Утверждения NUnit имеют в себе специальную логику, которая знает, что они находятся в блоке множественных утверждений. В этом случае они не выдают исключение при сбое, а вместо этого регистрируют сбой с помощью родительского множественного утверждения, которое сообщит об ошибке, когда оно будет завершено.

Свободные утверждения должны будут делать то же самое внутри. Это может быть так же просто, как привязка к утверждениям NUnit или даже просто вызов Assert.Fail. Я бы порекомендовал зарегистрировать проблему в проекте Fluent assertions. Не стесняйтесь указывать мне на GitHub (@rprouse), если им нужна помощь в том, как работает внутреннее устройство NUnit.

person Rob Prouse    schedule 30.08.2017
comment
Для справки, эквивалентом в FluentAssertions является AssertionScope. - person Dennis Doomen; 30.08.2017
comment
@DennisDoomen Если я использую AssertionScope и вызываю внутри него два метода, каждый из которых имеет одно утверждение, я получаю следующее сообщение в обозревателе тестов: Ожидаемое значение равно 2, но найдено 1. Ожидаемое значение равно 4, но найдено 3. Могу ли я настроить это сообщение? Например, включить в него имя метода, чтобы я мог видеть, в каком методе утверждение не выполняется? - person YMM; 30.08.2017
comment
Каждый из этих методов, за исключением дополнительного параметра, указывает причину ожидаемого результата. - person Dennis Doomen; 01.09.2017

Вы можете:

1: Используйте AssertionScope (как указал @RonaldMcdonald):

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

Or:

<сильный>2. Используйте пакет NuGet FluentAssertions.AssertMultiple (маленький пакет, созданный мной):

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);
});
person Dariusz Woźniak    schedule 07.11.2019