"async void"단위 테스트를 인식 할 수없는 이유는 무엇입니까?


79

async void 단위 테스트는 Visual Studio 2012 내에서 실행할 수 없습니다.

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}

비동기 단위 테스트를 원하면 테스트 메서드가 Task를 반환해야합니다.

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}

왜 그래야만하지? async void테스트 방법 이 꼭 필요한 것이 아니라 궁금합니다. Visual Studio 2012는 async void실행할 수없는 경우에도 테스트 메서드 를 빌드 할 때 경고 나 오류를 표시하지 않습니다.

답변:


83

async void메소드는 "Fire and Forget"으로 간주되어야합니다. 완료 될 때까지 기다릴 방법이 없습니다. Visual Studio가 이러한 테스트 중 하나를 시작하는 경우 테스트가 완료 될 때까지 기다리거나 (성공으로 표시) 발생한 예외를 트랩 할 수 없습니다.

를 사용하면 async Task호출자는 실행이 완료 될 때까지 기다릴 수 있고 실행 중에 발생한 모든 예외를 트랩 할 수 있습니다.

대에 대한 자세한 내용은 이 답변 을 참조하십시오 .async voidasync Task


3
이것은 사실이 아닙니다. NUnit은 async void테스트를 지원하며이를 지원하는 방법과 이유는이 링크에 어느 정도 자세히 설명되어 있습니다 . 아래 답변을 참조하십시오 .
Anupam 2015 년

21

MSTest가 async void단위 테스트를 지원하지 않기 때문 입니다. 인 들은 실행할 수있는 환경을 도입함으로써 그렇게.

MSTest는이를 지원하지 않습니다. 아마도 마이크로 소프트가 기존 테스트에 너무 많은 변경을가했다고 판단했기 때문입니다 (기존 테스트에 예상치 못한 컨텍스트가 주어지면 교착 상태가 될 수 있습니다).

완벽하게 유효한 C # 코드이므로 컴파일러 경고 / 오류가 없습니다. 작동하지 않는 유일한 이유는 단위 테스트 프레임 워크 때문이며 (즉, xUnit이 async void테스트를 지원한다고 생각합니다 ) C # 컴파일러가 귀하의 속성을보고 귀하를 결정하는 것은 우려 사항 분리를 심각하게 위반하는 것입니다. MSTest를 사용하고 있으며 실제로 async void.


1
첫 번째 구현 (Visual Studio Preview)에서는 테스트가 인식되고 "실행"됩니다. 문제는이 방법이 첫 번째 대기에서 끝날 것이고 그것이 테스트의 결과라는 것입니다.
Paulo Morgado

21

VS2015에서 비동기로 장식 된 모든 테스트 메서드가 테스트 탐색기에 표시되지 않음을 발견했습니다. 결국 async 키워드를 제거하고 테스트에서 await 호출을 task.Wait ()로 바꾸고 task.Result에 대한 내 주장을 수행했습니다.

잘 작동하는 것 같습니다. 아직 예외 테스트로 시도하지 않았습니다.

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);

3
task.Result를 호출하면 task.Wait ()를 호출 할 필요가 없다고 생각하지 마십시오. task.Result는 작업이 완료되지 않은 경우 자동으로 task.Wait ()를 호출합니다.
stt106
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.