2012-09-28 6 views
3

비동기 메서드를 호출하는 동기 메서드에 대한 단위 테스트를 작성하는 올바른 방법은 무엇입니까? 지금은 단위 테스트가 지나가고 있지만 페이지를 열려고하면 결코 반환되지 않습니다. 내 단위 테스트가 실패하는 이유는 무엇입니까? 어떻게 실패시킬 수 있습니까?비동기 메서드를 호출하는 동기 메서드를 단위 테스트하는 방법?

나는이 간단한 코드로 내 문제를 복제 :

내 통과 시험 :

public ActionResult Index() 
    { 
     var syncService = new SyncService(); 

     return View((object)syncService.DoSomeWork()); 
    } 
볼 반환하지

내 서비스 :

을 반환하지

[TestMethod] 
    public void DoSomeWork_WhenWeDoSomeWork_ShouldReturnDone() 
    { 
     var service = new SyncService(); 

     const string expected = "Done"; 
     var actual = service.DoSomeWork(); 

     Assert.AreEqual(expected, actual); 

    } 

내보기

public class SyncService 
    { 
     public string DoSomeWork() 
     { 
      return SomeWork().GetAwaiter().GetResult(); 
     } 

     private async Task<string> SomeWork() 
     { 
      var task1 = Task.Delay(1000); 
      var task2 = Task.Delay(1000); 

      await Task.WhenAll(task1, task2); 

      return "Done"; 
     } 
    } 

답변

0

먼저, don't block on async code (내 블로그에 링크). async 코드를 차단하면 실제로 교착 상태가 발생합니다. unit tests run in a thread pool context, not an ASP.NET context (내 블로그 링크) 때문에이 교착 상태가 단위 테스트에서 발생하지 않습니다.

good reasons for not having synchronous wrappers for asynchronous methods이 있습니다. 따라서 DoSomeWork을 완전히 없애고 SomeWork (이름은 SomeWorkAsync)으로 남겨 두는 것이 좋습니다.

문제를 해결하려면 asynchronous controller actions을 사용해야합니다.

1

이 구체적인 예를 통해 내가 도울 수 있다고 생각지 않지만 좋은 전략은 두 가지 테스트를 작성하는 것입니다. 하나는 동기 메서드가 올바른 데이터를 전달하는지 테스트하고 다른 하나는 비동기 메서드가 제대로 작동하는지 테스트합니다.

저는 주로 JavaScript에서 작동하며 일반적인 접근 방식이 저에게 효과적입니다. 또한 테스트 프레임 워크의 문서를 확인할 수 있습니다. 어쩌면이 방법을 제공합니다.

+0

+1 항상 좋은 습관입니다. 스레딩/비동기 로직을 ​​다른 로직과 분리하십시오. – Augusto

관련 문제