Внедрение конструктора модульного тестирования

Предположим, что мой класс Foo имеет следующее:

readonly IService service;

public Foo(IService service) 
{
    if (service == null)
        throw new ArgumentNullException("service");

    this.service = service;
}

public void Start()
{
    service.DoStuff();
}

Пока у меня есть один модульный тест для конструктора, в котором я передаю значение null, чтобы убедиться, что выдается ArgumentNullException. Нужен ли мне второй модульный тест для моего конструктора, в котором я передаю действительный IService и проверяю, что this.service установлен (для чего потребуется общедоступный метод доступа)?

Или я должен просто полагаться на свой модульный тест для метода Start, чтобы проверить этот путь кода?


person markyd13    schedule 01.04.2013    source источник


Ответы (2)


Установка this.service - это деталь реализации, поэтому вам следует просто проверить, используется ли она там, где ожидается, и просто проверить это с помощью метода Start. Чтобы ваши тесты не стали хрупкими.

Вы только хотите проверить, правильно ли используется ваш сервис. Вам все равно, как он хранится.

person Justin Pihony    schedule 01.04.2013

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

И, честно говоря, я больше даже не утруждаюсь записывать эти нулевые проверки в свои конструкторы. Причина проста: контейнеры DI не позволяют автоматически связывать конструкторы с нулевыми ссылками (или, по крайней мере, не по умолчанию), поэтому нет возможности создания типов с использованием нулевых значений (при автоматическом подключении контейнером) . Таким образом, он просто добавляет бесполезный код, который заставляет меня добавлять бесполезные тесты, когда я хочу иметь высокий охват кода.

Я говорю полностью пропустить эти нулевые проверки и доверять своему контейнеру DI (или выбрать контейнер DI, которому вы можете доверять).

person Steven    schedule 01.04.2013
comment
Вы также можете полностью удалить ctor и позволить ему сгенерировать его с помощью шаблона T4, как это делает этот проект: t4ctorgenerator.codeplex.com. Нет необходимости в модульном тестировании сгенерированного кода. - person Steven; 02.04.2013