我已经创建了一个自定义的NUnit约束,比如:
public class FooConstraint : Constraint
{
public FooConstraint(Foo expected)
{
this.expected = expected;
}
public override ConstraintResult ApplyTo<TActual>(TActual actual)
{
// ... (*)
}
private Foo expected;
}
为方便起见:
public static class FooIs
{
public static FooConstraint EqualTo(Foo expected)
{
return new FooConstraint(expected);
}
}
因此在一些类的测试中,我可以编写:
Assert.That(x.Foo, FooIs.EqualTo(expectedFoo));
如果在某些类中有Foo
个实例的集合怎么办?如何重用可能比较复杂的比较代码(*)
也可以编写:
Assert.That(x.Foos, Is.EqualTo(expectedFooArray));
我知道我可以创建IEqualityComparer<Foo>
的实现,在自定义约束中使用它并添加.Using()
,但这不允许我就不匹配的实际区别写清楚的消息(比较器仅返回bool
)。
我的意思是在FooConstraint
中,您通常使用ConstraintResult
的一些自定义子类,例如:
public class FooConstraintResult : ConstraintResult
{
// ...
public override void WriteMessageTo(MessageWriter writer)
{
// write clean failure message
}
}
那么,在比较集合时,有什么方法可以告诉NUnit使用自定义约束,而不仅仅是自定义比较器?