2012-08-22 62 views
1

我試圖測試一個組成控件集合的方法。它調用兩種方法:Presenter中的單元測試方法,MVP

  1. 複製原始集合。
  2. 排序新的集合。

理想情況下,id希望能夠傳入一個集合並進行測試,看看它是否正確排序。編號也想驗證方法1)被調用了兩次,見下文基於以下嘗試:當我嘗試創建MainPresenter的實例 Example using RhinoMock

下面的測試產生錯誤。一般jist的錯誤是「無法從Moq.Mock轉換爲」FrazerMann.CsvImporter.UserInterface.IMainForm。 +類似的一個IFileDialog。

[Test] 
    public void ComposeCollectionOfControls_CallSequence_4Calls() 
    { 
     var main = new Mock<IMainForm>(); 
     var dialog = new Mock<IFileDialog>(); 
     var temp = new Mock<IMainPresenter>(); 

     temp.Setup(s => s.PopulateLists<Control>(It.IsAny<TableLayoutPanel>(), It.IsAny<List<Control>>())); 

     var testObject = new MainPresenter(main.Object, dialog.Object); 
     testObject.ComposeCollectionOfControls(It.IsAny<object>(), It.IsAny<EventArgs>()); 
     temp.Verify(v => v.PopulateLists<Control>(It.IsAny<TableLayoutPanel>(), It.IsAny<List<Control>>()), Times.Once());   
    } 

我想測試ComposeCollectionOfControls確保PopulateList()被調用了兩次。

public interface IMainPresenter 
{ 
    void PopulateLists<T>(TableLayoutPanel userInputs, List<T> container) where T : Control; 
    int SortList<T>(T control1, T control2) where T : Control; 
} 

public class MainPresenter:IMainPresenter 
{ 
    UserInputEntity inputs; 

    IFileDialog _dialog; 
    IMainForm _view; 

    public MainPresenter(IMainForm view, IFileDialog dialog) 
    { 
     _view = view; 
     _dialog = dialog; 
     view.ComposeCollectionOfControls += ComposeCollectionOfControls; 
     view.SelectCsvFilePath += SelectCsvFilePath; 
     view.SelectErrorLogFilePath += SelectErrorLogFilePath; 
     view.DataVerification += DataVerification; 
    } 

    public void ComposeCollectionOfControls(object sender, EventArgs e) 
    { 
     PopulateLists<TextBox>(_view.ColumnNameCtrls, _view.SortedColumnNameCtrls); 
     _view.SortedColumnNameCtrls.Sort(SortList<TextBox>); 
     PopulateLists<ComboBox>(_view.ColumnDataTypeCtrls, _view.SortedColumnDataTypeCtrls); 
     _view.SortedColumnDataTypeCtrls.Sort(SortList<ComboBox>); 
    } 
} 

可能有人請給我一些指點,如何這應該怎麼辦?

回答

3

您看到的錯誤是因爲您正在傳遞模擬類本身(類型爲Moq.Mock),而不是Moq爲您創建的模擬對象。

相反的:

var testObject = new MainPresenter(main, dialog); 

你需要:

var testObject = new MainPresenter(main.Object, dialog.Object); 

順便說一句,它通常被認爲是不好的做法,明確地驗證這樣的方法調用在一個特定的製造數量的東西方法。這會導致測試和特定實現之間的緊密耦合,並因此導致脆弱的測試。

通過測試您調用某個方法的次數,在代碼的最終結果仍然正確時重構某些代碼後,您經常會發現測試失敗。

測試所涉及對象的最終狀態要好得多,並且讓測試不知道該狀態是如何達到的。

+0

臉掌!非常感謝David –

+0

非常感謝您對原始答案的編輯,我沒有意識到這一點。出於好奇(這是我的事件處理程序調用一個單獨的方法的原因,但你昨天提到這是錯誤的,所以即時通訊假設我犯了一個愚蠢的錯誤),我得到一個空對象錯誤,我假設是由於這條線「testObject .ComposeCollectionOfControls(It.IsAny (),It.IsAny ());「是否可以使用It.IsAny ()填寫發件人/ e? –