如何在 nunit 中原子地测试属性
本文关键字:测试 属性 nunit | 更新日期: 2023-09-27 18:33:02
给定一个具有多个属性的对象,例如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);
我假设您不想让类型本身检查相等性并覆盖ToString
?因为那样会很好。
一种选择是使用匿名类型来实现相同的目标:
Assert.AreEqual(new { X = testX, Y = testY },
new { croppingRectangle.X, croppingRectangle.Y });
由于匿名类型的工作方式(自动生成Equals
和ToString
),这应该会给你一个很好的错误消息,并同时检查所有属性。不过,它确实依赖于每个属性的相等性检查作为每个属性类型的默认检查。
如果您的矩形是某种值对象,则可以依靠 .Equals
方法一次比较整个对象。
或者,您可以将错误附加到列表中。
var errors = new List<String>()
if(croppingRectangle.Prop == ExpectedValue) {
//test
}
else {errors.add("ErrorMessage");}
.... and so on
Assert.IsEqual(errors.Count, 0);
或者,您可以使用 Fluent 断言根据包含预期属性和值的匿名对象验证对象。请参阅 http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html