我正在使用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);
}
答案 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();
这可以解决您的问题。