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

时间:2017-02-24 09:07:39

标签: asp.net unit-testing async-await microsoft-fakes shim

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

await中,这会调用名为GetAllDeatails的异步任务方法,并返回一个对象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创建中产生错误,因为返回类型必须在GetAllDeatails中是异步的,但此处它只返回对象。

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

  

错误CS0029无法隐式转换类型   'ProjectAPI.Models.ResModel'来   'System.Threading.Tasks.Task<ProjectAPI.Models.ResModel>'   未itTestProjectAPI

2 个答案:

答案 0 :(得分:1)

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

在该方法假设返回任务时,您将返回模型。使用Task.FromResult将模型包装在Task中,以便可以返回并等待它。

在执行测试方法时,您声明用于保存等待结果的变量是Task<ResModel>。这应该改变,因为当你await一个返回结果的任务时,它只返回结果而不是任务。因此,结果变量需要更改为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);
    }
}

答案 1 :(得分:0)

更改方法返回类型  到

(公共异步任务 &LT; ResModel&GT; GetFromGetDetails()