0

给定一个具有多个属性的对象,比如 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);
4

3 回答 3

1

我假设您不想让类型本身检查是否相等并覆盖ToString?因为那样会很好。

一种选择是使用匿名类型来实现相同的目标:

Assert.AreEqual(new { X = testX, Y = testY },
                new { croppingRectangle.X, croppingRectangle.Y });

由于匿名类型的工作方式(使用EqualsToString自动生成),这应该会给您一个很好的错误消息并同时检查所有属性。不过,它确实依赖于每个属性相等性检查作为每种属性类型的默认检查。

于 2013-09-27T21:28:18.843 回答
0

如果您的矩形是某种值对象,则可以依靠该.Equals方法一次比较整个对象。

或者,您可以将错误附加到列表中。

var errors = new List<String>()

if(croppingRectangle.Prop == ExpectedValue) {
    //test
}
else {errors.add("ErrorMessage");}

.... and so on

Assert.IsEqual(errors.Count, 0);
于 2013-09-27T21:28:57.063 回答
0

或者,您使用 Fluent Assertions 针对包含预期属性和值的匿名对象验证您的对象。见http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html

于 2013-09-28T05:30:16.500 回答