Как проверить свойства атомарно в Nunit
Учитывая объект с несколькими свойствами, скажем System.Drawing.Rectangle, я хотел утвердить значения ВСЕХ свойств (не останавливаясь, когда ОДНОЕ свойство не совпадало) и сообщить ВСЕ свойства.
Я попробовал этот код, надеясь, что он будет делать то, что я хотел...
System.Drawing.Rectangle croppingRectangle = SomeMethodReturnsRectangle(testP1,testP2);
Assert.That(()=>{ croppingRectangle.X==testX && croppingRectangle.Y==testY },"expected X={0}, Y={1} but was X={2},Y={3}", testX,testY,croppingRectangle.X,croppingRectangle.Y);
Какой правильный способ сделать это в NUnit?
(Я понимаю, что это работает:)
if(croppingRectangle.X==testX && croppingRectangle.Y==testY) {
Assert.Pass();
else
Assert.Fail("expected X={0}, Y={1} but was X={2},Y={3}", testX,testY,croppingRectangle.X,croppingRectangle.Y);
3 ответа
Я предполагаю, что вы не хотите, чтобы сам тип проверял равенство и переопределение ToString
? Потому что это было бы хорошо.
Одним из вариантов будет использование анонимных типов для достижения той же цели:
Assert.AreEqual(new { X = testX, Y = testY },
new { croppingRectangle.X, croppingRectangle.Y });
Из-за способа работы анонимных типов (с Equals
а также ToString
автоматически генерируется), это должно дать вам хорошее сообщение об ошибке и проверить все свойства одновременно. Тем не менее, он полагается на проверку равенства для каждого свойства, которая является проверкой по умолчанию для каждого типа свойства.
Или вы используете Fluent Assertions для проверки вашего объекта по анонимному объекту, который содержит ожидаемые свойства и значения. См. http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html
Если ваш прямоугольник является чем-то вроде объекта значения, вы можете положиться на .Equals
метод для сравнения всего объекта за раз.
Или вы можете просто добавить в список ошибок.
var errors = new List<String>()
if(croppingRectangle.Prop == ExpectedValue) {
//test
}
else {errors.add("ErrorMessage");}
.... and so on
Assert.IsEqual(errors.Count, 0);