使用Moq针对异步方法设置C#测试

Pau*_*cas 1 c# unit-testing moq async-await

我正在尝试使用Moq创建一组测试方法来覆盖外部依赖项。这些依赖项本质上是异步的,我遇到了一组依赖项,它们在等待时再也不会返回,因此我不确定我缺少什么。

测试本身非常简单。

[TestMethod]
public async Task UpdateItemAsync()
{
    var repository = GetRepository();
    var result = await repository.UpdateItemAsync("", new object());
    Assert.IsNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

下面列出了要测试的代码,执行带有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;
}
Run Code Online (Sandbox Code Playgroud)

我确定该Setup方法的Moq对象上的GetRepository方法中有错误,但是我不确定是什么问题。

Nko*_*osi 5

您需要修复异步调用中的设置

Moq有一个ReturnsAsync允许模拟的异步方法调用完成的流程。

client
    .Setup(_ => _.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
    .ReturnsAsync(new ResourceResponse<Document>());
Run Code Online (Sandbox Code Playgroud)

您通常希望避免Task手动更新