如何对等待另一个异步任务的 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>'
UnitTestProjectAPI
错误消息明确指出它无法将 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()
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>'
UnitTestProjectAPI
错误消息明确指出它无法将 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()