我有一个正在测试的方法。
void MethodIAmTesting()
{
SomeObject so = new SomeObject();
_someService.AnotherMethodCall(so);
}
现在,我正试图在我的单元测试中模拟“so”。
void UnitTestMethod
{
SomeObject testSO = new SomeObject();
//Fill in data here.
_classMock.Expect(instance => instance.AnotherMethodCall(testSO));
_mainClass.MethodIAmTesting();
}
但是当我运行测试时,它只使用在真实方法中实例化的空版本。我怎样才能得到我正在调用的方法来使用我的 testSO 而不是真实代码中的 so?或者这是不可能的?
谢谢。
最佳答案
设计的一部分,测试驱动开发应该促使您转向依赖注入(inject)。通常,当您发现难以进行单元测试的内容时,那是因为您需要重新考虑您的设计。
在这种情况下,您的被测对象可能应该适合创建 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 创建一个接口(interface)。然后你可以为它创建一个 stub 并轻松测试对其进行的调用、 stub 行为/属性等。当你以这种方式做事时,测试事情变得容易得多。例如,让我们考虑如何编写测试以确保 _someService
由 SomeObject
提供:
void EnsureSomeObjectPassedToService()
{
// arrange
SomeObject so = new SomeObject()
// act
_mainClass.MethodIAmTesting(so);
// assert
_someObject.AssertWasCalled(x => x.AnotherMethodCall(so));
}
就是这样!当您做对事情时非常容易。
关于c# - 用 mock.Expect() 调用中的对象覆盖实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10624900/