如何对等待另一个异步任务的 AsyncTask 进行单元测试?

How to Unit test an AsyncTask which await another Async task?

public async Task<ResModel> GetDetails()
{
    ResModel resp = new ResModel();
    resp = await MobController.GetAllDeatails();
    return resp;
}

await 中,这调用名为 GetAllDeatails 的异步任务方法和 return 一个对象 ResModel

如何为此正确创建单元测试?

我创建的单元测试就在下面:

[TestMethod]
public async Task GetFromGetDetails()
{
    var controller = new SevicesController();
    ResModel resp = new ResModel();

    using(ShimsContext.Create())
    {
        ProjectAPI.Fakes.ShimMobController.GetAllDeatails = () => {
            resp.MessageType = "Get"
            resp.Message ="contdetail";

            return resp;
        };

        returnValueOfAsyncTask = await controller.GetDetails();

        Assert.IsNotNull(returnValueOfAsyncTask);
    }

}

这会在 ShimContext 创建时出错,因为 return 类型在 GetAllDeatails 中必须是异步的,但这里它只是 return 对象。

以下是我遇到的主要错误:

Error CS0029 Cannot implicitly convert type 'ProjectAPI.Models.ResModel' to 'System.Threading.Tasks.Task<ProjectAPI.Models.ResModel>' Un‌​itTestProjectAPI

错误消息明确指出它无法将 ResModel 转换为 Task<ResModel>,这是被填充方法的 return 类型。

在 shim 中,当方法被假设为 return 任务时,您正在 return 模型。使用 Task.FromResult 将模型包装在任务中,以便它可以 return 并等待。

在测试方法的练习中,您声明用于保存等待结果的变量是 Task<ResModel>。这应该改变,因为当你 await 一个任务 return 结果它只是 return 结果而不是任务。因此需要将结果变量从 Task<ResModel> 更改为 ResModel.

这里是基于以上修改的更新单元测试。

[TestMethod]
public async Task GetFromGetDetails() {
    //Arrange
    var controller = new SevicesController();
    var expected = new ResModel();

    using(ShimsContext.Create()) {

        ProjectAPI.Fakes.ShimMobController.GetAllDeatails = () => {
            expected.MessageType = "Get"
            expected.Message ="contdetail";

            return Task.FromResult(expected); 
        };

        //Act
        var actual = await controller.GetDetails();

        //Assert
        Assert.IsNotNull(actual);
        Assert.AreEqual(expected, actual);
    }
}

更改方法 return 类型 至

(public 异步任务 < ResModel> GetFromGetDetails()