2016-08-02 7 views
1

Я использую карту Rhino.Mocks и Structure, чтобы помочь модулю проверить мой код. У меня есть несколько тестов, которые проходят, когда они запускаются сами по себе, но при запуске, когда группа не проходит. Код установки для этих модульных тестов:Тестирование модуля, не использующее правильный издевательский класс

[TestInitialize()] 
public void Setup() 
{ 
    ObjectFactory.Initialize(x => 
    { 
     x.For(IManager)().Use(Handler)(); 
    }); 
} 

В моих тестах я завершаю этот интерфейс и вызываю метод.

[TestMethod] 
public void AreMultiple_Test() 
{ 
    var mackIManager = MockRepository.GenerateMock<IManager>(); 
    mackIManager.Stub(u => u.GetTwoUserName(Arg<int>.Is.Anything)).Return(null); 
    ObjectFactory.Inject(typeof(IManager), mackIManager); 

    StepAdditionalActionBase actionBase = new StepAdditionalActionBase(); 
    bool areMultiple = actionBase.AreMultiple(new WorkOrder { Id = "123" }); 

    Assert.IsFalse(areMultiple); 
} 

Метод испытания 2

[TestMethod] 
public void AreMultiple_Test() 
{ 
    var mackIManager = MockRepository.GenerateMock<IManager>(); 
    mackIManager.Stub(u => u.GetTwoUserName(Arg<int>.Is.Anything)).Return("123"); 
    ObjectFactory.Inject(typeof(IManager), mackIManager); 

    StepAdditionalActionBase actionBase = new StepAdditionalActionBase(); 
    bool areMultiple = actionBase.AreMultiple(new WorkOrder { Id = "123" }); 

    Assert.IsTrue(areMultiple); 
} 

Это блок тестирования следующий код.

public bool AreMultiple(WorkOrder workOrder) 
{ 
    string secondUser = _handler.GetTwoUserName(_workflowManager.GetNumberForProject(workOrder.Id)); 
    if (String.IsNullOrEmpty(secondUser)) 
    { 
     return false; 
    } 

    return true; 
} 

Когда я запускаю их самостоятельно, они работают нормально. Когда я запускаю их вместе, первый проходит, а второй терпит неудачу. Когда я отлаживаю второй, я считаю, что возвращаемое значение в методе Stubbed все еще возвращается как null. Как это сделать, чтобы использовать новый метод Stubbed.

UPDATE.

Я использую StructureMap в качестве контейнера. Из того, что я смог найти, следующий код - это то, что используется для утилизации контейнера, которое я получил от этого link. Когда я добавил это, тест все равно терпит неудачу при запуске вместе, но проходит, когда запускается индивидуально.

[TestCleanup()] 
public void TestCLeanup() 
{ 
    ObjectFactory.Container.Dispose(); 
} 
+0

Как вы разрешаете поле '_handler'? –

ответ

1

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

В тестах вы издеваться интерфейс IManager и зарегистрировать его в ObjectFactory:

ObjectFactory.Inject(typeof(IManager), mackIManager); 

Тогда SUT использует локатор ObjectFactory службы разрешить и использовать высмеивал интерфейс (_handler поле) :

string secondUser = _handler.GetTwoUserName(...) 

Я подозреваю, что первые тестовые регистры _handler и никогда не очищать его должным образом, так что во втором тесте появляется тот же экземпляр. Вы должны сбросить ObjectFactory между испытаниями, следующими за образцом Register Resolve Release.

Другой вариант (предпочтительнее) - реорганизовать ваш SUT, чтобы получить зависимость IManager handler явно через constructor. Это упростило бы как SUT, так и тесты, перемещающие конфигурацию ObjectFactory на Composition Root.

+0

Итак, как мне сбросить завод? Это будет ответом на вопрос, который я ищу. – Nate

+0

Я искал метод утилизации завода и добавил его к моему вопросу. Даже с этим дополнением, я все еще имею такую ​​же проблему. – Nate

+0

Что такое 'x' и что такое' Handle' в методе установки? Кто-нибудь из них статичен? –