2015-04-26 2 views
0

Я использую ninject для инъекций зависимостей в моей производственной среде. Я вижу два варианта, когда дело доходит до написания модульных тестов. Я могу либо создавать конкретные классы, либо вводить их с помощью ninject, или я могу использовать фальшивую фреймворк, как просто макет.При использовании Ninject для инъекций зависимостей лучше всего использовать Ninject в своих модульных тестах или использовать насмешливую структуру.

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

Есть ли наилучшая практика для этого типа вещей?

ответ

3

С модульными испытаниями на классе, нет смысла включать контейнер DI в «тестируемую систему» ​​(SUT).

  • по принципу, юнит тест класса должен проверить класс и класс только
  • обычно вы не можете «повторно использовать» привязки в тестовом модуле, вы должны создать их блок-тест специфичны. Поэтому вы только повторно тестируете ninject, но не как его применяете. Ninject уже протестирован. Так что никакой реальной выгоды для вас.

Если вы выполняете приемочное тестирование/модульное тестирование на уровне компонентов или приложений, то имеет смысл включать Ninject в SUT.

Для тестирования на уровне класса обычно используется динамическая прокси-система, основанная на смешении, например MOQ или FakeItEasy.

дал реализацию:

public interface IDependency { 
    void Foo(string bar); 
} 

public class SomeClass 
{ 
    private readonly IDependency dependency; 

    public SomeClass(IDependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void SomeMethod(string arg) 
    { 
     this.dependency.Foo(arg); 
    } 
} 

тест будет выглядеть (XUnit вкус):

public class SomeClassTest 
{ 
    private readonly Mock<IDependency> dependency; 

    private SomeClass testee; 

    public SomeClassTest() 
    { 
     this.dependency = new Mock<IDependency>(); 

     this.testee = new SomeClass(this.dependency.Object); 
    } 

    [Fact] 
    public void SomeMethod_MustPassArgumentToFoo() 
    { 
     const string expectedArgument = "AnyArgument; 

     this.testee.SomeMethod(expectedArgument); 

     this.dependency.Verify(x => x.Foo(expectedArgument)); 
    } 
} 
+0

Мы не используем Ninject в наших модульных тестах, как в ответе от BatteryBackupUnit (сумасшедшее имя btw :-)), но мы используем его в наших тестах приемки. Приемочный тест проверяет (почти) полную функцию (без интерфейса пользователя, базы данных или любого другого внешнего API-интерфейса процесса). – Urs

+0

@ Спасибо за объяснение приемочных испытаний. Я изменил текст, чтобы упомянуть «приемочные испытания» вместо «spec testing», потому что это более широко известный и более точно определенный термин. – BatteryBackupUnit

0

JustMock имеет Ninject встроенный в него плюс mocking container based on it.

Инъекционный издеваются зависимости происходят автоматически, когда вы принести экземпляр в первый раз:

var container = new MockingContainer<ClassUnderTest>(); 
var testee = container.Instance; 

Plus, вы можете использовать синтаксис Ninject для мелкозернистого контроля поведения впрыска, а также синтаксиса JustMock в для настройки макета поведения.

Смежные вопросы