单元测试未显示async / await的代码覆盖率

时间:2017-12-22 21:02:05

标签: c# unit-testing asynchronous moq

我正在使用vs2017,我的单元测试都没有显示代码覆盖率。我正在使用async / await和MOQ。

[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);
}

2 个答案:

答案 0 :(得分:1)

第一个事实是,您实际上并没有在测试中测试任何内容,只需创建模拟并调用模拟。

您只是测试模拟框架的效果与广告一样。

其次,测试也可以是异步的,以允许测试按顺序进行。

[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);
}

答案 1 :(得分:0)

没有任何等待您的repositoryMock设置完成。因此,您的测试用例将在您的异步调用完成之前结束。

请务必等待添加:

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

或者

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

或者

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

这可以解决您的问题。