9

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

readonly IService service; 

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

    this.service = service; 
} 

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

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

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

ответ

12

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

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

9

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

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

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

+0

Что-то еще, что вы можете сделать, это полностью удалить ctor и позволить ему сгенерировать шаблон T4, например, этот проект делает: https://t4ctorgenerator.codeplex.com/. Нет необходимости в модульном тестировании сгенерированного кода. – Steven