如何单元测试等待另一个异步任务的AsyncTask?
public async Task<ResModel> GetDetails()
{
ResModel resp = new ResModel();
resp = await MobController.GetAllDeatails();
return resp;
}
在await
这需要一个名为GetAllDeatails
的异步任务方法,并返回一个对象ResModel
。如何单元测试等待另一个异步任务的AsyncTask?
如何正确创建一个单元测试呢?
我创建单元测试的正下方:
[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>'
的Un itTestProjectAPI
是我得到的主要错误。
错误消息明确指出,它不能将ResModel
转换为Task<ResModel>
,这是要擦除的方法的返回类型。
在垫片中,当方法假定要返回任务时,您正在返回模型。使用Task.FromResult
为了在任务中包装模型,以便它可以返回并等待。
在测试方法的运用中,您声明用于保存等待结果的变量是Task<ResModel>
。这应该改变,因为当你返回一个结果的任务时,它只会返回结果而不是任务。因此需要将结果变量从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);
}
}
亲爱的@Nkosi感谢您在这里快速回答。我也尝试过。但在** returnValueOfAsyncTask = await controller.GetDetails()作为响应行; **行给出了上述相同的错误。有什么建议么? 但这缩小了我到一行谢谢。 –
@TharushaShehan'returnValueOfAsyncTask'是什么类型,错误信息到底是什么? – Nkosi
亲爱的@Nkosi错误与上面相同。 **错误CS0029不能隐式地将类型'ProjectAPI.Models.ResModel'转换为'System.Threading.Tasks.Task
更改方法的返回类型 到
(公共异步任务 < ResModel> GetFromGetDetails()
这是测试方法。没有必要改变这一点。 – Nkosi
亲爱的@Shoba感谢您的回答。但我无法更改源代码。它与许多其他功能相关。所以我不能仅仅为了测试目的而改变它。 –
亲爱@BartoszKP我编辑了问题,并缩小它作为你的建议。该问题必须与创建为** ProjectAPI.Fakes.ShimMobController.GetAllDeatails **的假方法相同,因为这必须返回一个Async对象,但在这里它只返回一个对象 –
谢谢,这样更好。 ,粘贴错误消息E在后,所以它是完全清楚你在说什么错误约:) – BartoszKP
谢谢@BartoszKP **错误\t CS0029 \t无法隐式转换类型“ProjectAPI.Models.ResModel”到“System.Threading.Tasks.Task'\t UnitTestProjectAPI ** 是我得到的主要错误。问题必须是我创建为假的返回类型与给定的AsyncTask方法之间的区别。任何想法....? –