2009-12-09 4 views
0

NMock을 사용하여 다음 테스트를 통과했습니다. 서비스 호출의 결과가 뷰로 전달되었을 때 작동했지만 이전에는 결과가 dto로 변환 되었기 때문에 실패했습니다.NMock 문제 목록

이것은 사용자 정의 정규 표현식을 작성해야한다는 의미 일지 모르지만 확실하지 않습니다. 누구든지 아이디어가 있습니까?

오류 메시지 : 예상

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(); 

    } 

답변

2

- NMock 2.0 advanced topics documentation의 섹션 "NMock 2.0 고객 매처 (Matchers)"에서 설명한대로, 사용자 정의 정규 및 정적 팩토리 클래스를 작성해야합니다. 기본적으로

는 NMock은 (LoadProjects 세트 여부 mockView.ProjectsexpectedSetProjectsRequest 여부에보고, 귀하의 경우) 기대에 전달 된 인수와 일치하도록 Equals를 사용합니다.

List<T>.Equals 구현 (Object에서 상속)은 단지 checks whether the two variables reference the same object이며,이 경우에는 분명히 그렇지 않습니다. (LoadProjects 메서드는 get 접근 자 결과를 DTO로 변환하는 과정에서 새로운 DTO 목록 인스턴스를 만드는 것처럼 보입니다.)

참조 평등을 확인하는 대신 NMock에게 수행 할 작업을 지정해야합니다. 다행히 위의 링크 된 NMock 문서의 사용자 정의 ListMatcher (및 해당 IsList 클래스)이 트릭을 모두 수행 할 수 있습니다. ProjectPresentationDto.Equals이 값의 동일성을 검사하는 경우 해당 예제 클래스를있는 그대로 사용할 수 있습니다. 그렇지 않은 경우 DTO에 대한 동등성을 정의하기 위해 사용자 정의해야합니다.

+0

감사합니다. James :-) – m0gb0y74

+0

위 링크 NMock 2.0 고급 주제 문서 (http://www.nmock.org/advanced.html)가 깨졌습니다. 설명서 링크는 http://nmock.sourceforge.net/advanced.html입니다. 답변 해 주셔서 감사합니다. – inlokesh