2015-09-09 4 views
1

ниже - пример производственного кода, который я пытаюсь выполнить модульным тестированием. Я изо всех сил пытаюсь разрешить зависимость к конкретному классу, который используется.Moq with Unity Контейнерное тестирование

public MyClass(IUnityContainer container) 
{ 
    this.unityContainer = container; 
} 

public string DoWork() 
{ 
    var sender = unityContainer.Resolve<IInterface>(); // how to setup this object 
    var json = sender.Send("something"); 
    var value = serializer.Deserialize<SomeModel>(json); 
    return value.url; 
} 

Я хочу издеваться над II-интерфейсом, используемым этим методом. Как установить это в своем модульном тестовом коде? Я чувствую, что здесь что-то не хватает. это имеет запах антишаблона .....

+0

@CodeCaster Это не мой код :(просто пытаюсь увеличить покрытие кода. Я понятия не имею, почему они передают экземпляр контейнера DI в этот класс. – Mateo

ответ

4

это имеет запах антишаблона

Это, конечно, делает. Почему вы передаете экземпляр в свой контейнер DI в конструктор бизнес-объекта? Вместо этого вы должны передать IInterface. См. Dependency Injection container in constructor.

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

public void MyUnitTest() 
{ 
    IUnityContainer myContainer = new UnityContainer(); 
    myContainer.RegisterType<IInterface, YourInstance>(); 

    MyClass classUnderTest = new MyClass(myContainer); 
    classUnderTest.DoWork(); 

    Assert... 
} 

См How to use Unity.RegisterType with Moq? издеваться над YourInstance.

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