0

失敗するNMockを使用した次のテストがあります。サービス呼び出しの結果がビューに渡されたときに機能していましたが、結果が dto に変換されるため、現在は失敗しています。

これは、カスタムマッチャーを作成する必要があることを意味していると思いますが、よくわかりません。誰にもアイデアはありますか?

エラーメッセージ:

Test method Dgc.Cpo.RM.UI.Presentation.Test.ProjectPresenterTest.LoadProjectsTest threw exception:  NMock2.Internal.ExpectationException: unexpected invocation of projectView.SetProjects(<System.Collections.Generic.List`1[Dgc.Cpo.ResourceManagement.UI.Presentation.ProjectPresentationDto]>)

予想: 1 回: projectView.SetProjects(equal to) [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();

    }
4

1 に答える 1

2

NMock 2.0 の高度なトピック ドキュメントの「NMock 2.0 のカスタマー マッチャー」セクションで説明されているように、カスタム マッチャーと静的ファクトリ クラスを作成する必要があります。

デフォルトでは、NMock は、Equals渡された引数を期待に一致させるために使用します (この場合、LoadProjects設定mockView.Projectsされているかどうかを確認しますexpectedSetProjectsRequest)。

List<T>.Equals実装 (から継承)は、2 つの変数が同じ object を参照しているかどうかをチェックするObjectだけで、この場合は明らかにそうではありません。( get アクセサーの結果を DTO に変換する過程で、新しい DTO リスト インスタンスを作成するメソッドのように見えます。)LoadProjects

参照の等価性をチェックする代わりに、NMock に何をすべきかを伝える必要があります。幸いなことに、上記でリンクした NMock ドキュメントのカスタムListMatcher(および対応するクラス) は、それだけですべてのトリックを行うことができます。IsList値が等しいかどうかをチェックする場合ProjectPresentationDto.Equalsは、そのサンプル クラスをそのまま使用できます。そうでない場合は、DTO の等価性を定義するためにカスタマイズする必要があります。

于 2009-12-09T16:35:15.223 に答える