문제
실패한 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 (동일) [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();
}
해결책
당신은 그것을 얻었습니다 - 당신은 "NMOCK 2.0의 고객 매칭 자"섹션에 설명 된대로 사용자 정의 매칭과 정적 공장 클래스를 만들어야합니다. Nmock 2.0 고급 주제 문서.
기본적으로 Nmock은 사용합니다 Equals
인수와 일치하는 것은 기대치에 전달되었습니다 (귀하의 경우, LoadProjects
세트 mockView.Projects
에게 expectedSetProjectsRequest
또는 아니에요).
그만큼 List<T>.Equals
구현 (상속 Object
) 단지 두 변수가 동일한 객체를 참조하는지 여부를 확인합니다, 그리고이 경우 그들은 분명히 그렇지 않습니다. ( LoadProjects
메소드 새로운 DTO 목록 인스턴스 생성 GET 액세서 결과를 DTO로 변환하는 과정에서.)
참조 평등을 확인하는 대신 Nmock에게해야 할 일을 알려야합니다. 운 좋게도 관습 ListMatcher
(그리고 해당 IsList
클래스) 위에서 링크 한 Nmock 문서에서 자체적으로 트릭을 수행 할 수 있습니다. 만약에 ProjectPresentationDto.Equals
가치 평등을 확인하면 해당 예제 클래스를 사용할 수 있습니다. 그렇지 않은 경우 DTO의 평등을 정의하기 위해이를 사용자 정의해야합니다.