2017-12-13 4 views
-1

현재 프런트 엔드 API 호출을 테스트하는 통합 테스트가 있습니다. 따라서 호출은 비동기이므로 호출이 예상 한 결과와 비교할 준비가 될 때까지 강제로 호출합니다.통합 테스트는 Thread.Sleep에서만 작동합니다.

그러나 문제는 코드에 기다리지 않은 다른 비동기 호출도 포함되어 있다는 점입니다. 그래서 우리는 중첩 비동기 호출을했습니다. 이것은 또한 테스트가 때때로 성공하고 때로는 실패하는 (경쟁 조건) 원인도 있습니다.

지금까지 Thread.Sleep (10000)을 코드에 추가하여이 문제를 해결했습니다. 그러나 이것은 좋은 해결책이 아닙니다.

코드는 다음과 추천했습니다 :

[TestMethod] 
    public void Integration_Test_Example() 
    { 
     // Arrange 
     ... 

     // Act 
     var request = CreateRequest(@"testfile.xml"); 
     var task = target.SendMessage(request); 

     Thread.Sleep(10000); // dirty fix 

     task.Wait(); 

     // Assert 
     ... 
    } 

사람은 우리가 최선이 문제를 해결할 수있는 방법에 대한 조언이 있습니까?

답변

1

정확하게 이해하면 SendMessage 작업을 반환하므로 테스트를 계속 진행하기 전에 기다려야합니다.

[TestMethod] 
public async Task Integration_Test_Example() 
{ 
    var request = CreateRequest(@"testfile.xml"); 
    var result = await target.SendMessage(request); 
} 
+0

다른 비동기 호출이 기다려온되지 awaitable로 테스트를 변경할 수 있습니다. –

+1

'SendMessage'가 작업을 반환합니다. 왜'SendMessage'에서'await'을 할 수 없습니까? 'SendMessage' 코드를 보여줄 수 있습니까? – FCin

+1

@LeviSteenbergen 그렇지만 구현이 잘못되었다고 말하는 것이 아니며 테스트가 실제로 실패하는 것은 운이 좋은 것이 아닌가? 프로덕션에서는 그 경주도 할 수 있겠지? – Fildor

0

그러므로 당신이 작동하지 않는,

[TestMethod] 
    public async Task Integration_Test_Example() 
    { 
     // Arrange 
     ... 

     // Act 
     var request = CreateRequest(@"testfile.xml"); 
     await target.SendMessage(request); 

     // Assert 
     ... 
    } 
+0

다른 비동기 호출이 기다려지지 않으므로 작동하지 않습니다 –

+3

@LeviSteenbergen 그런 다음 ** 완전한 ** 예제를 제공하십시오! – Fildor

관련 문제