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

如何单元测试等待另一个异步任务的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

是我得到的主要错误。

+0

亲爱@BartoszKP我编辑了问题,并缩小它作为你的建议。该问题必须与创建为** ProjectAPI.Fakes.ShimMobController.GetAllDeatails **的假方法相同,因为这必须返回一个Async对象,但在这里它只返回一个对象 –

+0

谢谢,这样更好。 ,粘贴错误消息E在后,所以它是完全清楚你在说什么错误约:) – BartoszKP

+0

谢谢@BartoszKP **错误\t CS0029 \t无法隐式转换类型“ProjectAPI.Models.ResModel”到“System.Threading.Tasks.Task '\t UnitTestProjectAPI ** 是我得到的主要错误。问题必须是我创建为假的返回类型与给定的AsyncTask方法之间的区别。任何想法....? –

错误消息明确指出,它不能将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); 
    } 
} 
+0

亲爱的@Nkosi感谢您在这里快速回答。我也尝试过。但在** returnValueOfAsyncTask = await controller.GetDetails()作为响应行; **行给出了上述相同的错误。有什么建议么? 但这缩小了我到一行谢谢。 –

+0

@TharushaShehan'returnValueOfAsyncTask'是什么类型,错误信息到底是什么? – Nkosi

+0

亲爱的@Nkosi错误与上面相同。 **错误CS0029不能隐式地将类型'ProjectAPI.Models.ResModel'转换为'System.Threading.Tasks.Task 'Un itTestProjectAPI ** 现在它只在我提到的行评论。至于** returnValueOfAsyncTask **是我声称作为单元测试的变量,它是**任务 ** –

更改方法的返回类型 到

(公共异步任务 < ResModel> GetFromGetDetails()

+0

这是测试方法。没有必要改变这一点。 – Nkosi

+0

亲爱的@Shoba感谢您的回答。但我无法更改源代码。它与许多其他功能相关。所以我不能仅仅为了测试目的而改变它。 –