如何在 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);

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

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

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

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

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

如果您的矩形是某种值对象,则可以依靠 .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