2012-05-16 89 views
3

我有一个我正在测试的方法。用mock.Expect()中的对象覆盖实例化对象调用

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

设计的一部分,测试驱动开发应该推动你进行依赖注入。通常当你发现一些难以进行单元测试的东西时,这是因为你需要重新考虑你的设计。

在这种情况下,您的被测主体可能应该是合理的创建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)); 
} 

这就是它!当你做正确的事情时很容易。