如何重用NUnit的约束?

时间:2018-12-12 14:05:34

标签: c# unit-testing nunit

我已经创建了一个自定义的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使用自定义约束,而不仅仅是自定义比较器?

0 个答案:

没有答案