메소드에 전달 된 리턴 값


390

인터페이스에 대한 방법이 있습니다.

string DoSomething(string whatever);

나는 이것을 MOQ로 조롱하여 전달 된 모든 것을 반환합니다.

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

어떤 아이디어?

답변:


525

다음과 같이 입력 매개 변수와 함께 람다를 사용할 수 있습니다.

.Returns((string myval) => { return myval; });

또는 약간 더 읽기 쉽습니다.

.Returns<string>(x => x);

1
아주 쉽게 당신이하는 방법이 작업을 수행 할 때까지 보인다 (7 개) 인수 ... 나는 검사 할 때 IReturnsMOQ에, 그것은 정의 Returns에 대한 대부분의에서 4 개 인수 . 그 문제를 해결하는 쉬운 방법이 있습니까? / 나는 Moq 소스 수정을 제외하고 //
mizuki nakeshu

14
자, 그것은 v 에서 최대 9 개의 인수 에 대해 정의되었습니다 . 해결 :)Moq4.0.0.0
mizuki nakeshu

14
@ mizukinakeshu 나는 클래스 / 메소드가 너무 많은 것처럼 들리는 9 인수 메소드에 대해 약간의 리팩터링을 고려할 것입니다. 아마도 9 개의 매개 변수를 설정 클래스 또는 리팩토링하여 나중에 도움을 줄 수 있습니까?
상원 의원

@ TheSenator 동의합니다. 이것에 대해 이미 다시 생각하지는 않지만 이미 수정하지 않은 기존 코드에 대해 일부 단위 테스트를 해킹 한 것 같습니다. 그렇지 않으면이 수의 인수는 반드시 리팩토링을 요구합니다.
mizuki nakeshu

27
.Returns<string>점이 혼란 스러울 때 참고 사항 : 문자열 입력은 반환하는 값이 아니라 입력 매개 변수 를 나타냅니다.
Jim

241

더 유용한 것은 여러 매개 변수가있는 경우 다음을 사용하여 모든 매개 변수에 액세스 할 수 있습니다.

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

메소드 중 하나만 사용하더라도 메소드의 서명과 일치하도록 항상 모든 인수를 참조해야합니다.


17
이것이 정답입니다. 이것이 바로 당신이해야 할 일입니다. 다른 것은 "예상 된 인수 수"예외를 발생시킵니다.
Chaim Eliyah

그렇습니다. 확실히 읽기 쉽고 할당하기도 쉽습니다 ReturnsAsync!
Piotr Kula

1
이 답변은 하루를 구했습니다. 참고 (미래 독자), 조금 더 나아가도 좋습니다. .Returns ((문자열 a, 문자열 b, 문자열 c) => {문자열 d = "wow"; return string.Concat (a, b, c, d);});
granadaCoder 2014 년

1
개인적으로 이것은 훨씬 더 나은 대답입니다. 나는 Moq에 대한 지식이 거의 없지만 여전히 그것을 즉시 이해했습니다.
unrealsoul007

void를 반환하는 메소드의 경우 .Callback ((string a, Exception b, string c) => throw new Exception (b.Message));
tymtam

62

일반적인 Returns<T>방법으로이 상황을 잘 처리 할 수 ​​있습니다.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

또는 메소드에 여러 입력이 필요한 경우 다음과 같이 지정하십시오.

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.