我尝试使用Moq创建一组测试方法来覆盖外部依赖项。这些依赖性本质上是异步的,我遇到了一组它们等待时它们永远不会返回,所以我不确定我错过了什么。
测试本身非常简单。
[TestMethod]
public async Task UpdateItemAsync()
{
var repository = GetRepository();
var result = await repository.UpdateItemAsync("", new object());
Assert.IsNotNull(result);
}
上面的GetRepository
方法是设置各种模拟对象的方法,包括在它们上面调用Setup。
private static DocumentDbRepository<object> GetRepository()
{
var client = new Mock<IDocumentClient>();
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
client.Setup(m => m.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
.Returns(() =>
{
return new Task<ResourceResponse<Document>>(() => new ResourceResponse<Document>());
});
var repository = new DocumentDbRepository<object>(configuration, client.Object);
return repository;
}
下面列出了测试中的代码,当执行带有await的行时,它永远不会返回。
public async Task<T> UpdateItemAsync(string id, T item)
{
var result = await Client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), item);
return result.Resource as T;
}
我确定错误出现在Setup
方法中Moq对象的GetRepository
方法中,但我不确定问题是什么。
答案 0 :(得分:4)
您需要修复异步调用
上的设置 Moq有一个ReturnsAsync
,允许模拟的异步方法调用流程完成。
client
.Setup(_ => _.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
.ReturnsAsync(new ResourceResponse<Document>());
您通常希望避免手动新增Task