2017-12-22 5 views
1

vs2017을 사용하고 있으며 단위 테스트에서 코드 커버리지를 보이지 않습니다. 난 "을 사용하여 M/기다리고 및 비동기 MOQ.유닛 테스트에서 async/await 코드 커버리지가 보이지 않음

[TestMethod] 
[TestCategory("SeriesRepository")] 
public void GetSeriesAsyncShouldReturnSeriesId12345() 
{ 
    var repositoryMock = new Mock<ISeriesRepository>(); 

    var seriesId = "12345"; 
    var channel = 75864;    

    var mockSeries = new Mock<ISeries>(); 
    mockSeries.SetupGet(x => x.SeriesId).Returns("12345"); 

    repositoryMock 
     .Setup(x => x.GetSeriesAsync(seriesId, channel)) 
     .ReturnsAsync(mockSeries.Object); 

    var result = repositoryMock.Object.GetSeriesAsync(seriesId, channel).Result; 

    result.SeriesId.Should().Be(seriesId); 
} 
+0

과 같을 것이다. 이 테스트에서 다루고있는 것으로 예상되는 코드 중 커버되지 않은 코드가 있습니까? –

+0

* 단위 테스트 코드 *가 표시된대로 표시되지 않거나 실제 논리 코드 *가 적용되지 않는 이유는 무엇입니까? 전자의 경우 테스트가 실제로 실행되는지 확인하십시오. 후자의 경우 ** 어디에서 ** 실제 논리 코드를 호출하고 있습니까? 당신이 조롱을 취한 다음, 당신이 그것을 조롱했을 때 모의 행동을하는 것처럼 보입니다. 여기서 테스트 할 실제 논리 코드는 무엇입니까? –

답변

1

첫 번째 사실은 단순히 mock을 만들고 mock을 호출하기 때문에 테스트에서 아무 것도 테스트하지 않는다는 것입니다.

조롱 프레임 워크가 광고되는대로 작동하는지 테스트하는 것입니다.

두 번째로 테스트는 순차적으로 테스트를 수행 할 수 있도록 비동기 적으로 만들 수도 있습니다. 일이 생각 무엇

[TestMethod] 
[TestCategory("SeriesRepository")] 
public async Task GetSeriesAsyncShouldReturnSeriesId12345() { 
    var repositoryMock = new Mock<ISeriesRepository>(); 

    var seriesId = "12345"; 
    var channel = 75864;    

    var mockSeries = new Mock<ISeries>(); 
    mockSeries.Setup(_ => _.SeriesId).Returns(seriesId); 

    repositoryMock 
     .Setup(_ => _.GetSeriesAsync(seriesId, channel)) 
     .ReturnsAsync(mockSeries.Object); 

    var result = await repositoryMock.Object.GetSeriesAsync(seriesId, channel); 

    result.SeriesId.Should().Be(seriesId); 
} 

당신은 몇 가지 원하는 동작

을 확인하기 위해 예상대로 작동하는 테스트에서 대상의 종속성을 조롱 우리는 클래스의 대상 방법을 테스트하고 싶었 말할 수 있다는 것입니다 . 예 테스트

public class SeriesService { 
    private readonly ISeriesRepository repository; 

    public SeriesService(ISeriesRepository repository 
     this.repository = repository; 
    } 

    public async Task<ISeries> GetSeries(string seriesId, int channel) { 
     var series = await repository.GetSeriesAsync(seriesId, channel); 

     //...do some other stuff 

     return series; 
    } 
} 

같은 뭔가 다음에서만 호출되고이 아닌 테스트 코드 발생하지 않을 조롱 방법을 호출 한 것으로 나타났습니다이

[TestMethod] 
[TestCategory("SeriesRepository")] 
public async Task TargetMethodShouldReturnSeriesId12345() { 
    //Assert 
    var repositoryMock = new Mock<ISeriesRepository>(); 

    var seriesId = "12345"; 
    var channel = 75864;    

    var mockSeries = new Mock<ISeries>(); 
    mockSeries.Setup(_ => _.SeriesId).Returns(seriesId); 

    repositoryMock 
     .Setup(_ => _.GetSeriesAsync(seriesId, channel)) 
     .ReturnsAsync(mockSeries.Object); 

    var target = new SeriesService(repositoryMock.Object); 

    //Act 
    var result = await target.GetSeries(seriesId, channel); 

    //Assert 
    result.Should().NotBeNull(); 
    result.SeriesId.Should().Be(seriesId); 
} 
+0

TargetClass에 대해 혼란스러워합니다. TargetClass는 SeriesService 클래스와 비슷합니다. 내 SeriesService 클래스는 ISeriesRepository가 삽입 될 것으로 기대합니다. – user3582849

+0

@ user3582849에 해당 할 수 있습니다. 그 클래스에 대한 예제를 보여줌으로써 고립 된 단위 테스트를 수행 할 수 있습니다. – Nkosi

+0

감사합니다. 그랬어. 리포지토리 테스트 또는 서비스 테스트로 간주되는 대상은 무엇입니까? SeriesRepositoryTest라는 시험 클래스를 만들었습니다. Repostory를 테스트하고 있다면 서비스 계층을 어떻게 테스트해야합니까? – user3582849

0

이 비동기 호출이 완료하기 전에 repositoryMock 설정이. 그래서, 테스트 케이스가 종료를 완료하는 대한 대기가 없습니다.

확인 당신은 추가 기다립니다

repositryMock.setup(...).ReturnsAsync(...).GetAwaiter().GetResult(); 

또는

repositryMock.setup(...).ReturnsAsync(...).Result; 

또는

repositryMock.setup(...).ReturnsAsync(...).Wait(); 

이렇게하면 문제가 해결됩니다.

+1

차단 호출 인'.Result'를 읽는 것을 제외하고 말입니까? (* 실제로는 작업이 포함되어 있으면 차단 호출이어야합니다). –

+0

예,이 차단 호출을해야합니다. 다음 호출이 일어나기 전에 모든 관련 작업이 실행되도록합니다. 테스트 방법이 Async이면 호출을 차단하는 대신 기다릴 수 있습니다. – Shankar

관련 문제