2014-05-20 55 views
0

需要一些建議......我是新來的嘲弄東西了,正在寫一些MOQ測試......而且我正在試驗一個接口,我必須測試:嘲笑一個界面與一個類嘲弄

說我有這個接口:

interface IAWClient 
{ 
    void Login(string); 
}  

我寫我喜歡這個MOQ測試...

MOQ測試1:

[Test] 
public void LoginTest() 
{ 
    Mock<IAWClient> m = new Mock<IAWClient>(); 
    m.Setup(x => x.Login("Joe")); 

    m.Object.Login("Joe"); <<-- this is the line I am interested in 
} 

但已經看到無數的例子,其中混凝土類用於測試界面......像這樣的:

public class AdmissionMngr 
{ 
    IAWClient m_IAWClient; 
    public AdmissionMngr(IAWClient iaw) 
    { 
     m_IAWClient = iaw; 
    } 

    public void Admit(string name) 
    { 
     m_IAWClient.Login(name); 
    } 
} 

使用像這樣的模擬測試:

MOQ測試2:

[Test] 
public void LoginTest() 
{ 
    Mock<IAWClient> m = new Mock<IAWClient>(); 

    m.Setup(x => x.Login("Joe")); 

    AdmissionMngr admin = new AdmissionMngr(m.Object); 

    admin.Admit("Joe"); <<-- this is the line I am interested in 
} 

對於所示的兩條線......是最小起訂測試1和最小起訂測試2是否相等? 爲什麼或爲什麼不?

非常感謝!

+0

那麼在這兩種情況下模擬調用的方法是相同的。最後都是用''Joe''調用'Login'方法一次。你可以通過運行調試器來看到這一點。你使用哪一個取決於你正在測試的內容。後者可能是測試'AdminMngr'類的一個好方法。第一個測試似乎是無用的;你正在創建一個模擬並告訴它期待一個特定的方法調用,然後明確地調用你自己的方法。這總是會成功,並沒有告訴你任何事情。 –

+0

模擬就像一個空洞的類,它去除了所有的邏輯。你不想測試一個模擬。如果你這樣做,你會測試莫克如何表現,而不是你的班級。 –

回答

3

這就是依賴注入的樣子。您正在測試AdmissionMngr,但要確保您沒有測試由該管理器使用的IAWClient,請創建模擬IAWClient實現(使用模擬框架),並將其作爲依賴項傳遞給對象構造函數。

關於你發佈的代碼:

第一個實際測試模擬對象,所以國際海事組織這是毫無意義。第二個測試AdmissionMngr及其依賴模擬,這是單元測試中的常見做法。

+0

我理解事物的依賴注入方...這是有道理的......我不確定MOQ測試的區別是什麼?他們做同樣的事情嗎? – user3174075

+0

MOQ Test 1中的moq代碼是否執行任何操作(m.Object.Login(「Joe」);)? – user3174075

+0

不,第一個測試可以調用模擬方法,只需調用它即可。第二個測試是'AdmissionMngr'在內部調用'IAWClient.Login'作爲'Admit'方法調用的一部分。 – MarcinJuraszek

2

你的嘲笑存在被注入到其他測試用例中。你不測試你的嘲笑......他們總是會產生你告訴他們產生的東西(你的第一個例子是這樣做的)。

當你嘲笑某事 - 它沒有被測試。您可以使用模擬來測試其他需要該類型對象的其他功能。你可以讓它提供一些預期的輸入,但另一個對象應該基於此產生一些預期的輸出。

所以,你的第二個例子是要走的路。

+0

非常感謝你 – user3174075