2017-12-10 5 views
0

첫 번째 호출에서 예외를 throw하고 두 번째 호출에서 void를 반환하도록 Moq를 설정하려고합니다. 내가 조롱하는 방법은 void 반환 유형 (예 : public void Bar())입니다.Moq의 SetupSequence를 사용하여 예외를 throw 한 다음 void를 반환 할 수 있습니까?

것들 내가

을 시도이 Returns 인수를 필요로하며 SetupSequence 인수를 입력해야하기 때문에 컴파일 오류가 있습니다. Void는 C#에서 유형이 아니기 때문에

_mock.SetupSequence(m => m.Bar()) 
    .Throws<Exception>() 
    .Returns(); 

이 컴파일 오류가 있습니다.

_mock.SetupSequence<IMyMock, Void>(m => m.Bar()) 
    .Throws<Exception>() // first invocation throws exception 
    .CallBase(); 

내가 SetupSequence()에 포기하고 예외를 던질 Callback()로 전환 결국 해결

.

var firstTime = true; 
_mock.Setup(m => m.Bar()) 
    .Callback(() => 
    { 
     if (firstTime) 
     { 
      firstTime = false; 
      throw new Exception(); 
     } 
    }); 

질문

SetupSequenceFunc 아닌 Action합니다. 나는 이것이 무효화 방법을 조롱하는 데 사용될 수 없다는 것을 가정 할 때 정확합니까? SetupSequence()?

+0

필자가 아는 한, 'Setup'은 모든 호출에 대해 동일한 동작을 정의합니다. 모범이 있습니까? –

답변

0

당신은 (A pre-release package on NuGet으로 현재 사용할 수있는) MOQ 4.8.0로 시작하는이 작업을 수행 할 수 있습니다 void 방법에 대한

SetupSequence 지원은 GitHub의 문제 #451에서 논의하고 GitHub의 풀 요청 #463에 추가되었습니다.

당신은 아마 새로운 .Pass() 방법을 찾고 : "꼬리".Pass()에 호출하는

mock.SetupSequence(m => m.VoidMethod()) 
    .Throws(new InvalidOperationException()) 
    .Pass() 
    .Pass() 
    .Throws(new InvalidOperationException()) 
    .Pass(); 

참고하고 있습니다 아마 불필요.

관련 문제