我有一个类,我想编写单元测试。我在项目中使用了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()听起来像是可以工作的东西,但它没有。
我该如何解决这个问题?通过改变我的测试或实际重写被测试的课程。