Я создал собственное ограничение 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 использоватьпользовательское ограничение, а не просто пользовательский компаратор, при сравнении коллекций?