2013-11-25 2 views
0

변경되지 않았습니다. 예컨대 :MOQ 어설는

public Response Foo(Request request) 
{ 
    var response = _someObject.Bar(request); 
    return response.SomeProperty.SomeOtherProperty + 1; 
} 

나는 내가 DTO의 모든 구성원을 통해 걸을 수 알지만, 그 실제 크기 나 깊이의 DTO에 대한 입력의 할당한다입니다.

개체를 해싱하는 것이 가장 좋은 해결책입니까, 아니면 더 좋은 이유가 있습니까?

+0

DTO, 'Request'를 조롱 할 수 있습니까? –

+0

내 생각 엔 ... 그건 DTO에 인터페이스를 추가하는 것을 의미합니다. 나는 그걸 생각하지 않았다. – BanksySan

답변

1

DTO의 모든 값을 검사하는 대신 엄격한 모의 객체를 만들어 대신 전달할 수 있습니다. 예 : 모든 속성에 대한

var mockRequest = new Mock<IRequest>(MockBehavior.Strict); 

설정 기대는 평소와 같이 나와서, 모의 DTO에 예기치 않은 속성 집합이있는 경우 다음 테스트를 실패 할 MOQ에 둡니다.

+0

나는 이것이 최상의 솔루션일지도 모른다고 생각한다 ... 여전히 DTOs에 인터페이스를 설치하는 것을 좋아하지 않는다. 그러나 왜 나는 그것을 좋아하지 않는다. – BanksySan

0

또 다른 대안은 두 개체를 비교할 수있는 어설 션 프레임 워크를 사용하여 호출 전후의 개체가 동일한 지 비교하는 것입니다. 메서드가 동일한 객체 유형을 반환하면 반환 된 객체를 사용하여 원본과 비교할 수 있습니다. 종속성

[Test] 
public void Foo_WhenCallingFoo_ShouldNotAlterTheRequest() 
{ 
     var request = new Request(); 

     var result = Foo(Request); 

     result.ShouldBeEquivalentTo(requests); 
} 

또는 시험에서 방법은 다른 유형을 반환하는 경우, 당신은에 전달 된 개체를 가져 콜백을 사용할 수 있습니다에 의해 사용되는 오브젝트를 얻기 위해, MOQ를 사용하는 경우 그렇지 않은 경우, 콜백을 사용할 수 있습니다 의존성을 비교하고 그와 비교하십시오 :

// Arrange 
Request requestUsedBySomeObject = null; 
var originalRequest = new Request(); 
var someObject = new Mock<SomeObject>(); 
someObject.Setup(s => s.Bar(It.IsAny<Request>()).Callback<Request>(r => requestUsedBySomeObject = r)); 

// Act 
Foo(originalRequest); 

// Assert 
originalRequest .ShouldBeEquivalentTo(requestUsedBySomeObject);