[c#] “async void”단위 테스트를 인식 할 수없는 이유는 무엇입니까?

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실행할 수없는 경우에도 테스트 메서드 를 빌드 할 때 경고 나 오류를 표시하지 않습니다.



답변

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

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

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


답변

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

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

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


답변

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

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

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

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


답변