我有一个我正在测试的方法。
void MethodIAmTesting()
{
SomeObject so = new SomeObject();
_someService.AnotherMethodCall(so);
}
现在,我试图在我的单元测试中模仿“如此”。
void UnitTestMethod
{
SomeObject testSO = new SomeObject();
//Fill in data here.
_classMock.Expect(instance => instance.AnotherMethodCall(testSO));
_mainClass.MethodIAmTesting();
}
但是当我运行测试时,它只使用在真实方法中实例化的空版本。我怎样才能得到我正在调用的方法来使用我的testSO而不是真正的代码呢?或者那是不可能的?
感谢。
答案 0 :(得分:0)
测试驱动开发的部分设计应该引导您进行依赖注入。通常,当您发现难以进行单元测试时,这是因为您需要重新考虑您的设计。
在这种情况下,您的被测科目可能应该合理创建SomeObject
。相反应该向某人提供。也许在您测试它的类首次实例化时应该提供它,也许它是在您调用该方法时应该提供的东西。例如:
public class ClassBeingTested
{
public ClassBeingTested(SomeObject so)
{
// Inject class dependency when instantiated the class
}
void MethodIAmTesting(SomeObject so)
{
// Passing things needed for a function to complete its work
}
}
此外,您很可能希望为SomeObject创建一个接口。然后你可以为它创建一个存根,并轻松测试对它进行的调用,存根行为/属性等。当你以这种方式做事时,测试事情就变得容易多了。例如,让我们考虑如何编写测试以确保_someService
提供SomeObject
:
void EnsureSomeObjectPassedToService()
{
// arrange
SomeObject so = new SomeObject()
// act
_mainClass.MethodIAmTesting(so);
// assert
_someObject.AssertWasCalled(x => x.AnotherMethodCall(so));
}
就是这样!当你做对的时候很容易。