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.ProjectsexpectedSetProjectsRequest)。

List<T>.Equals实现(继承自)Object只是检查两个变量是否引用同一个对象,在这种情况下,它们显然没有。(看起来像是在LoadProjects将 get 访问器结果转换为 DTO 的过程中创建新 DTO 列表实例的方法。)

你必须告诉 NMock 做什么而不是检查引用相等性。幸运的是,我上面链接的 NMock 文档中的自定义ListMatcher(和相应的类)本身就可以解决问题。IsList如果ProjectPresentationDto.Equals检查值是否相等,您可以按原样使用该示例类。如果没有,您必须对其进行自定义以定义 DTO 的相等性。

于 2009-12-09T16:35:15.223 回答