Реализация интерфейса модульного тестирования, как это сделать? - PullRequest
1 голос
/ 23 марта 2012

Как проверить поведение реализаций интерфейсных методов в (абстрактных) классах без необходимости копировать тесты в каждый класс?

У меня есть (абстрактные) классы, которые реализуют несколькоинтерфейсы.Я знаю, как должен работать каждый интерфейс, и я определяю это в методах тестирования, чтобы мне не пришлось вручную повторять эти тесты для каждой реализации интерфейса.

Я мог бы создать для каждого интерфейса рефераткласс с тестами, и имеют абстрактный метод CreateSUT(), который создает новый экземпляр конкретного класса.Но тогда я должен был бы создать новый класс с той же реализацией CreateSUT() для каждого интерфейса, который реализует класс, поскольку C # не поддерживает множественное наследование.Есть ли лучший способ сделать это?

Также обратите внимание, что я также хочу протестировать интерфейсы, реализованные в абстрактных классах, которые имеют несколько неабстрактных подклассов, что немного усложняет ситуацию.


Этот вопрос не о том, должен ли я выполнять модульное тестирование моих реализаций интерфейса.Мнения расходятся, и я решил сделать это, потому что я знаю, как должны вести себя реализации интерфейса (никогда не возвращать нулевое значение, возвращать коллекцию только для чтения и т. Д.), И объединение этих тестов значительно упрощает мне тестирование.их реализации, сколько бы их ни было.

Ответы [ 3 ]

0 голосов
/ 23 марта 2012

Ну, я не понимаю, зачем вам это нужно, но вы можете написать статический вспомогательный класс с тестами для вашего интерфейса.Например,

public static class IFooTests
{
    public static void ShouldDoSomething(this IFoo foo)
    {
        // Assert something
    }
}

Позже для каждого объекта, который реализует интерфейс IFoo, вы можете быстро создавать методы тестирования:

[Test]
public void ShouldDoSomething()
{
    Bar bar = new Bar(); // create and setup your concrete object
    bar.ShouldDoSomething(); // call interface test extension
}
0 голосов
/ 10 ноября 2015

Вы можете создать список для хранения экземпляров всех конкретных реализаций вашего интерфейса, затем пройти через каждый элемент в этом списке и утвердить инвариант в вашем тесте.

В зависимости от вашей тестовой среды, должно бытьспособ получить действенную обратную связь, когда тест не пройден.

Быстрый поиск нашел мне это для nUnit: http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9

0 голосов
/ 23 марта 2012

Вы можете смоделировать абстрактный класс с помощью moq или создать интерфейс, который реализует все ваши интерфейсы, и затем ваш абстрактный класс реализует ваш вновь созданный интерфейс, а затем смоделировать новый интерфейс.

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