使用StructurMap ObjectFactory的单元测试失败

时间:2013-08-20 06:45:15

标签: unit-testing nunit structuremap rhino-mocks

我有一个类,我想编写单元测试。我在项目中使用了StructureMap(2.6.3),我遇到了一些问题。

为了测试我使用Nunit(2.6.0.12054)和RhinoMocks(3.6)。

通常我会在我的类的构造函数中注入依赖项,然后在我的单元测试中用mocks替换依赖项很容易。但是在某些情况下,我无法做到这一点,我无法控制何时创建测试类。在这些情况下,我使用ObjectFactory.GetInstance()来获取依赖项。

public class MyClass
{
    public int MyMethod(string parameter)
    {
        var myDependency = ObjectFactory.GetInstance<IMyDependency>();
        try
        {
            return myDependency.CalculateValue(parameter);
        }
        catch (Exception ex)
        {
            //Suppress exception.
            return 0;
        }
    }
}

对于这个类和方法,我想写两个测试。首先,我想测试依赖项是否被调用,并且它计算的值由被测试的类返回。其次,依赖项可能会抛出异常,我想测试这个异常是否被测试中的类所抑制,并且在这种情况下它返回零。

[TestFixture]
public class MyClassTests()
{
    [Test]
    public void MyMethod_DependencyReturnsValue_ReturnsValueFromDependency
    {
        //Arrange.
        const int valueFromDependencyStub = 333;
        var myDependencyStub = MockRepository.GenerateStub<IMyDependency>();
        myDependencyStub.Stub(x => x.CalculateValue()).Return(valueFromDependencyStub);
        ObjectFactory.Inject<IMyDependency>(myDependencyStub);
        var target = new MyClass();

        //Act.
        var result = target.MyMethod("test");

        //Assert.
        Assert.AreEqual(valueFromDependencyStub, result);
    }

    [Test]
    public void MyMethod_DependencyThrowsException_ReturnsZero
    {
        //Arrange.
        var myDependencyStub = MockRepository.GenerateStub<IMyDependency>();
        myDependencyStub.Stub(x => x.CalculateValue()).Throw(new Exception());
        ObjectFactory.Inject<IMyDependency>(myDependencyStub);
        var target = new MyClass();

        //Act.
        var result = target.MyMethod("test");

        //Assert.
        Assert.AreEqual(0, result);
    }
}

如果我单独运行这些测试,这两个测试都有效,但是如果我运行这两个测试它都不起作用。我的真实情况是第二次测试,其中存根依赖项抛出异常,先运行。当另一个测试运行时,存根依赖性仍会引发异常。

正如我所理解的那样,问题是我使用全局ObjectFactory并将我的存根注入其中。如果我可以在每次测试后清除ObjectFactory,那可能会有效,但我发现无法做到这一点。 ObjectFactory.EjectAllInstancesOf()听起来像是可以工作的东西,但它没有。

我该如何解决这个问题?通过改变我的测试或实际重写被测试的课程。

0 个答案:

没有答案