2012-05-16 69 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)); 
} 

這就是它!當你做正確的事情時很容易。