2014-12-10 1 views
7

Moq을 사용하여 일부 객체를 조롱하고 있으며, 그 중 일부는 인수로 전달 된 상당히 긴 매개 변수 수집 요청 객체를 가질 수 있습니다.'It'matcher 객체를 인라인으로 정의하는 대신 변수로 저장할 수 있습니까? (Moq)

재사용과 스타일을 쉽게하기 위해 조크 설정에 사용하기 위해 특정 인수와 함께 이러한 요청을 저장할 수 있기를 바랍니다. 예를 들어 :

var request = It.Is<GetBobbinsRequest> 
    (r.Parameter1 == value1 && [...] & r.ParameterN == valueN); 
mockedObject 
    .Setup(mo => mo.GetBobbins(request)) 
    .Returns(someBobbins); 

을하지만 그것은 작동하지 않습니다

mockedObject 
    .Setup(mo => 
    mo.GetBobbins(It.Is<GetBobbinsRequest> 
     (r.Parameter1 == value1 && [...] & r.ParameterN == valueN)) 
    .Returns(someBobbins); 

이된다. 나는 또한 시도했다 :

Func<GetBobbinsRequest> request =() => It.Is<GetBobbinsRequest> 
    (r.Parameter1 == value1 && [...] & r.ParameterN == valueN); 
mockedObject 
    .Setup(mo => mo.GetBobbins(request())) 
    .Returns(someBobbins); 

그러나 거기에서도 즐거움이 없다. 변수로 It 스타일 객체를 저장할 수있는 방법이 있습니까? 아니면 이것을 처리하는 다른 명백한 방법을 놓치고 있습니까?

답변

5

그리고 대답을 찾았습니다. 그것은 Moq 's Match (Class)입니다.

맞춤 matcher 만들기는 간단합니다. 당신은 당신의 일치 조건 및 옵션 친화적 인 렌더링 표현식 만들기 호출에서 값을 반환하는 방법을 만들어야합니다

[Matcher] 
public Order IsBigOrder() 
{ 
    return Match<Order>.Create(
     o => o.GrandTotal >= 5000, 
     /* a friendly expression to render on failures */ 
     () => IsBigOrder()); 
} 

이 방법은 어떤 모의 설정 호출에 사용할 수 있습니다 :

mock.Setup(m => m.Submit(IsBigOrder()).Throws<UnauthorizedAccessException>(); 

http://www.nudoq.org/#!/Packages/Moq/Moq/Match(T)

4

당신의 질문에 당신이 무엇을 가지고 있는지에 대한 간단한 설명은 대답을보기 전에 썼습니다.

에 대한 전화는 실제로 returning default(T) every time으로 끝납니다. 나중에 그것을 저장하고 나중에 사용하게됩니다. null을 전달하거나 매개 변수 유형의 기본값이 무엇이든간에 마찬가지입니다. It.Is에 대한 호출이 실제로 setting a static member in a "mock context"으로 작동하기 때문에

가 인라인이어야하는 이유는 그 사용에 Setupeventuallygetsaround에 대한 호출.

관련 문제