2013-02-22 119 views
1

如何爲這種情況編寫一個剛模擬的單元測試?嵌套私人方法單元測試

Private Method1 

{ 

    //calls private method - Method2 
} 

因此,當我嘲笑方法1,我需要再次在內部模擬方法2。

我使用窗體的私人訪問器來創建一個單元測試,例如。

FormName_accessor target=new FormName_accessor(); 

然後用這個target.Method1來調用我的單元測試。

+1

使用接口。 – SLaks 2013-02-22 18:01:13

+0

如果你這樣嘲笑,你究竟在測試什麼? – 2013-02-22 18:14:28

回答

3

這是一個嘲笑類的私有方法並驗證它們被調用的示例。

public class Item 
{ 
    public void Update() 
    { 
     Save(); 
    } 

    private void Save() 
    { 
     Validate(); 
     /// Save something 
    } 

    private void Validate() 
    { 
     /// Validate something 
    } 
} 

[Fact] 
public void EnsureNestedPrivateMethodsAreCalled() 
{ 
    // Arrange 
    Item item = Mock.Create<Item>(); 
    Mock.Arrange(() => item.Update()).CallOriginal().MustBeCalled(); 
    Mock.NonPublic.Arrange(item, "Save").CallOriginal().MustBeCalled(); 
    Mock.NonPublic.Arrange(item, "Validate").DoNothing().MustBeCalled(); 

    // Act 
    item.Update(); 

    // Assert 
    Mock.Assert(item); 
} 

注意安排模擬時,要確保原UpdateSave方法被調用。您只需要刪除未測試的功能。在這種情況下,我們正在測試調用Update結果調用私人成員SaveValidate。我們沒有測試Validate方法的實施。

+0

說,'Update'包含一些額外的邏輯,最後調用'Save'。在這個時候,如果我只想測試'Update'的實現,我是否需要嘲笑'Save'? – pinopino 2014-09-25 09:46:36