2013-06-06 2 views
6

메소드에 대한 모든 인수를 "요청"객체로 캡슐화하고 "응답"객체를 반환하는 패턴을 따르는 일부 코드 작업 중입니다. 그러나 이것은 MOQ를 조롱 할 때 약간의 문제를 야기합니다. 예를 들면 :"모든"객체에 대한 MOQ 스터 빙 속성 값

public class Query : IQuery 
{ 
    public QueryResponse Execute(QueryRequest request) 
    { 
     // get the customer... 
     return new QueryResponse { Customer = customer }; 
    } 
} 

public class QueryRequest 
{ 
    public string Key { get; set; } 
} 

public class QueryResponse 
{ 
    public Customer Customer { get; set; } 
} 

... 내가 키가

var customer = new Customer(); 
var key = "something"; 
var query = new Mock<ICustomerQuery>(); 

// I want to do something like this (but this does not work) 
// i.e. I dont care what the request object that get passed is in but it must have the key value I want to give it 

query.Setup(q => q.Execute(It.IsAny<QueryRequest>().Key = key)).Returns(new QueryResponse {Customer = customer}); 

을 내가 MOQ 가능 원하는 것을 감안할 때 고객을 반환하는 쿼리를 스텁 할 내 테스트에서?

답변

11

It.Is<T> 메서드를 찾으려면 인수에 임의의 일치 자 함수 (Func<T, bool>)를 지정할 수 있습니다. 키를 확인하는 예를 들어

:

query.Setup(q => q.Execute(It.Is<QueryRequest>(q => q.Key == key))) 
    .Returns(new QueryResponse {Customer = customer}); 
+0

감사합니다. – nashwan

0

난 당신이 사용자 정의 매처 (Matchers)이 할 수있는 생각한다. moq's QuickStart page에서

:

// custom matchers 
mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>(); 
... 
public string IsLarge() 
{ 
    return Match.Create<string>(s => !String.IsNullOrEmpty(s) && s.Length > 100); 
} 

난 당신이 비슷한 일을 할 수있는 생각한다. Match.Create<QueryRequest>을 사용하여 키와 일치하는 메소드를 만듭니다 (예 :

public QueryRequest CorrectKey(string key) 
{ 
    return Match.Create<QueryRequest>(qr => qr.Key == key); 
} 

다음

_query.Setup(q => q.Execute(CorrectKey(key))).Returns(new QueryResponse {Customer = customer}); 

참고 :이 코드를 시도, 그래서 완전히 중단하면 용서하지 않았습니다.

오, 약간의 관련 셀프 프로모션에 대해서 : 정확하게 이런 종류의 복잡성은 Moq와 다른 조롱 도구에 대한 저를 괴롭히는 것입니다. 따라서 정상적인 코드를 사용하여 메소드 인수를 확인할 수있는 조롱 라이브러리를 만들었습니다 : http://github.com/eteeselink/FakeThat. 중요한 리팩토링 (및 이름 바꾸기) 프로세스의 중간에 있으므로 숨을 멈추고 싶을 수도 있습니다. 그럼에도 불구하고, 나는 당신이 그것에 대해 어떻게 생각하는지 듣고 기뻐할 것입니다.

EDIT : 오, @ 네메스가 (아마) 더 나은 대답으로 저를 때려 눕히십시오. 아 ~.

관련 문제