Как повторно использовать ограничения NUnit? - PullRequest
0 голосов
/ 12 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...