2009-12-09 84 views
0

我有以下使用NMock失敗的測試。當服務調用的結果傳遞給視圖時,它曾經工作,但現在由於結果轉換爲dto而失敗。NMock問題與清單

我認爲這可能意味着我需要創建一個自定義匹配器,但我不確定。有沒有人有任何想法?

錯誤消息:

預期: 1時間:projectView.SetProjects(等於)[稱爲0次] 。

代碼:

public void LoadProjectsTest() 
    { 
     IList<ProjectServiceGetProjectsResponse> expectedGetProjectsResponse = new List<ProjectServiceGetProjectsResponse>(); 
     expectedGetProjectsResponse.Add(new ProjectServiceGetProjectsResponse() { Id = 1, Name = "Project 1", RefNo = "001", Complete = false, Dropped = false }); 
     expectedGetProjectsResponse.Add(new ProjectServiceGetProjectsResponse() { Id = 2, Name = "Project 2", RefNo = "002", Complete = true, Dropped = false }); 
     expectedGetProjectsResponse.Add(new ProjectServiceGetProjectsResponse() { Id = 3, Name = "Project 3", RefNo = "003", Complete = false, Dropped = true }); 

     IList<ProjectPresentationDto> expectedSetProjectsRequest = new List<ProjectPresentationDto>(); 
     expectedSetProjectsRequest.Add(new ProjectPresentationDto(expectedGetProjectsResponse[0])); 
     expectedSetProjectsRequest.Add(new ProjectPresentationDto(expectedGetProjectsResponse[1])); 
     expectedSetProjectsRequest.Add(new ProjectPresentationDto(expectedGetProjectsResponse[2])); 

     ProjectPresenter_Accessor target = new ProjectPresenter_Accessor(this.mockView, 
                     this.mockProjectService); 

     Expect.Once.On(this.mockProjectService).Method("GetProjects").Will(Return.Value(expectedGetProjectsResponse)); 
     Expect.Once.On(this.mockView).Method("SetProjects").With(expectedSetProjectsRequest); 

     target.LoadProjects(); 

     this.mock.VerifyAllExpectationsHaveBeenMet(); 

    } 

回答

2

你明白了 - 你需要創建一個自定義的匹配和靜態工廠類,如「在NMock 2.0客戶匹配器」的NMock 2.0 advanced topics documentation一節中所描述的。

默認情況下,NMock使用Equals匹配傳遞給預期的參數(在你的情況,看其是否LoadProjectsmockView.ProjectsexpectedSetProjectsRequest與否)。

List<T>.Equals執行(從Object繼承)只是​​,在這種情況下,他們顯然沒有。 (它看起來像LoadProjects方法在將get訪問器結果轉換爲DTO的過程中創建新的DTO列表實例。)

您必須告訴NMock做什麼而不是檢查引用相等性。幸運的是,我上面鏈接的NMock文檔中的自定義ListMatcher(和相應的IsList類)可能會完全依靠這個技巧。如果ProjectPresentationDto.Equals檢查值相等,您可以按原樣使用該示例類。如果沒有,你必須定製它來爲你的DTO定義平等。

+0

謝謝你的工作。 James :-) – m0gb0y74 2009-12-10 09:15:43

+0

上述鏈接NMock 2.0高級主題文檔(http://www.nmock.org/advanced.html)已損壞。該文檔的新鏈接是http://nmock.sourceforge.net/advanced.html。謝謝你的答案 – inlokesh 2013-03-14 12:51:44