2017-10-27 1 views
0

비동기 메서드에서 발생하는 예외를 주장하려고합니다.
아쉽게도이 주장은 작동하지 않습니다.단위 테스트 비동기 메서드에서 throwing 예외

디버크를 통해 throw new Exception(...)SaveCategoriesAsync(...) 메서드에서 호출되었음을 확인했습니다.

Action의 메서드는 일반적으로 단위 테스트에서 작동하지만 비동기에서는 작동하지 않는 것으로 보입니다.

내가 프레임 워크와 FluentAssertions 주장 프레임 워크로 조롱으로 FakeItEasy을 사용하고 있습니다.

[TestMethod] 
public void SaveCategoriesAsync_When_Then() 
{ 
    A.CallTo(() => this.articleRepository.GetArticles(A<IList<long>>._)).Returns(new List<ArticleModel>()); 

    Action action = async() => await this.testee.SaveCategoriesAsync(new List<int>()); 

    action.ShouldThrow<Exception>(); 
} 

예외를 주장 할 수있게하려면 무엇을 변경해야합니까? 대답은 실제로 내가 뭘하려 매우 유사 미리

+0

다른 스레드에서 예외를 catch 할 수 없습니다. ShouldThrow() 메서드가 특별한 작업을 수행하지 않으면 작동하지 않습니다. 어설 션 프레임 워크가 비동기 액션을 통해 예외를 감지하거나 직접 작성하는 방법을 제공하는지 확인하십시오. – helb

답변

1

감사합니다. 그러나 비동기, 당신은 대신 행동의 Func<Task>를 사용해야합니다 :

[TestMethod] 
public void SaveCategoriesAsync_When_Then() 
{ 
    A.CallTo(() => this.articleRepository.GetArticles(A<IList<long>>._)).Returns(new List<ArticleModel>()); 

    Func<Task> func = async() => await this.testee.SaveCategoriesAsync(new List<int>()); 

    func.ShouldThrow<Exception>(); 
} 
0

을가 NUnit을 고려, 테스트 러너를 쉽게 변경할 수있는 경우. 그런 다음 코드가 표시됩니다.

... 
Assert.ThrowsAsync<Exception>(async() => await this.testee.SaveCategoriesAsync(new List<int>()); 
... 
관련 문제