C# 列表的NMock问题

C# 列表的NMock问题,c#,unit-testing,nmock,C#,Unit Testing,Nmock,我使用NMock进行了以下测试,但失败了。当服务调用的结果被传递到视图时,它通常工作,但现在由于结果被转换为dto而失败 我想这可能意味着我需要创建一个自定义匹配器,但我不确定。有人有什么想法吗 错误消息: Test method Dgc.Cpo.RM.UI.Presentation.Test.ProjectPresenterTest.LoadProjectsTest threw exception: NMock2.Internal.ExpectationException: unexpect

我使用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]>)
测试方法Dgc.Cpo.RM.UI.Presentation.Test.ProjectPresenterTest.LoadProjectsTest引发异常:NMock2.Internal.ExpectationException:意外调用projectView.SetProjects()
预期: 1次:projectView.SetProjects(等于)[调用0次]

代码:

public void LoadProjectsTest()
{
IList expectedGetProjectsResponse=新列表();
expectedGetProjectsResponse.Add(新项目服务GetProjectsResponse(){Id=1,Name=“Project 1”,RefNo=“001”,Complete=false,drop=false});
expectedGetProjectsResponse.Add(新项目服务GetProjectsResponse(){Id=2,Name=“Project 2”,RefNo=“002”,Complete=true,drop=false});
expectedGetProjectsResponse.Add(新项目服务GetProjectsResponse(){Id=3,Name=“Project 3”,RefNo=“003”,Complete=false,drop=true});
IList expectedSetProjectsRequest=新列表();
expectedSetProjectsRequest.Add(新项目呈现到(expectedGetProjectsResponse[0]);
expectedSetProjectsRequest.Add(新项目呈现到(expectedGetProjectsResponse[1]);
expectedSetProjectsRequest.Add(新项目呈现到(expectedGetProjectsResponse[2]);
ProjectPresenter\u访问器目标=新的ProjectPresenter\u访问器(this.mockView,
这项服务),;
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();
}

您已经掌握了—您需要创建一个自定义匹配器和一个静态工厂类,如本教程的“NMock 2.0中的客户匹配器”部分所述

默认情况下,NMock使用
Equals
匹配传递给期望值的参数(在您的示例中,查看
LoadProjects
是否将
mockView.Projects
设置为
expectedSetProjectsRequest

List.Equals
实现(继承自
对象
),在本例中,它们显然不是。(它看起来像是在将get访问器结果转换为DTO的过程中创建新DTO列表实例的
LoadProjects
方法。)


您必须告诉NMock要做什么,而不是检查引用相等性。幸运的是,我上面链接的NMock文档中的自定义
ListMatcher
(以及相应的
IsList
类)可以自己完成这项工作。如果
projectPresentationTo.Equals
检查值是否相等,则可以按原样使用该示例类。如果没有,则必须对其进行自定义,以定义DTO的相等性。

上面的链接NMock 2.0 advanced topics documentation()已断开。文档的新链接是。非常感谢你的回答
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();

    }