如何在nunit中原子地测试属性

时间:2013-09-27 21:21:06

标签: c# nunit fluent-assertions

给定一个具有多个属性的对象,比如System.Drawing.Rectangle,我想断言所有属性的值(当ONE属性不匹配时不停止)并报告所有属性。

我试过这段代码,希望它可以做我想要的......

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 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

var errors = new List<String>()

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

.... and so on

Assert.IsEqual(errors.Count, 0);

答案 2 :(得分:0)

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