2016-08-02 66 views
1

我正在使用Rhino.Mocks和Structure map来帮助单元测试我的代码。当他们自己跑完时,我有几个测试通过,但是当作为一个组运行时未能通过。这些单元测试的设置代码是:单元测试不使用正确的嘲讽类

[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并且从不正确清理它,以便在第二次测试中出现相同实例。您应该在Register Resolve Release模式之后的测试之间重置ObjectFactory

另一个(优选的)选项是重构您的SUT以通过constructor明确接收IManager handler依赖项。这将简化SUT和将ObjectFactory配置移动到Composition Root的测试。

+0

好吧,那么如何重置工厂?那将是我正在寻找的问题的答案。 – Nate

+0

我查找了工厂配置方法,并将其添加到我的问题中。即使有了这个补充,我仍然有同样的问题。 – Nate

+0

在Setup方法中'x'和'Handle'是什么?他们是否是静态的? –