Документация NUnit 3 , которая вводит утверждения и сравнивает более новую модель ограничений с классической моделью, включает следующий пример:
Например, следующий код должен использовать модель ограничений. Там
не является настоящим классическим эквивалентом.
int[] array = new int[] { 1, 2, 3 };
Assert.That(array, Has.Exactly(1).EqualTo(3));
Assert.That(array, Has.Exactly(2).GreaterThan(1));
Assert.That(array, Has.Exactly(3).LessThan(100));
Хотя в документе говорится, что «реального классического эквивалента» не существует, один может использовать классический синтаксис с LINQ для написания того, что я считаю эквивалентными тестами:
Assert.AreEqual(1, array.Where(x => x == 3).Count());
Assert.AreEqual(2, array.Where(x => x > 1).Count());
Assert.AreEqual(3, array.Where(x => x < 100).Count());
Некоторые могут сделать вывод, что тесты модели ограничения, которые я поднял из документации, более читабельны, чем эти эквиваленты классической модели. Но это, возможно, субъективно.
Однако это не вся история. Более важным является улучшение в сообщении об ошибке , которое при неудачном тесте модели ограничения выдает при сбое теста . & dagger; Например, рассмотрим этот классический тест, который не пройдёт:
int[] array = new int[] { 1, 2, 3 };
Assert.AreEqual(1, array.Where(x => x == 4).Count());
AssertionException
, который выбрасывает NUnit, содержит следующее "краткое" Message
:
Expected: 1
But was: 0
Напротив, при выражении этого теста в более новом синтаксисе модели ограничений:
Assert.That(array, Has.Exactly(1).EqualTo(4));
... NUnit возвращает Message
:
Expected: exactly one item equal to 4
But was: < 1, 2, 3 >
Я думаю, что большинство согласится с тем, что это сообщение об исключении гораздо более полезно, чем сообщение, созданное с использованием более старого синтаксиса классической модели NUnit.
& dagger; Большое спасибо @ nashwan за помощь в понимании этого важного улучшения в обмене сообщениями об ошибках, представленном в модели ограничений.