【问题标题】:C# async Task - Unit testingC# 异步任务 - 单元测试
【发布时间】:2019-08-02 02:02:02
【问题描述】:

我是 C# 单元测试的新手,必须测试该方法是否正常工作。

这是我目前所拥有的:

  public async Task<IHttpActionResult> Post(API_FIRM_LINK aPI_FIRM_LINK)
    {
        db.API_FIRM_LINK.Add(aPI_FIRM_LINK);
        await db.SaveChangesAsync();

        return Created(aPI_FIRM_LINK);
    }

测试方法:不确定我是否走在正确的道路上 如果有人可以根据我的测试提供一个例子

     public async Task PostTest()

    {
        ////Arrange
        API_FIRM_LINKController controller = new API_FIRM_LINKController();

        API_FIRM_LINK aPI_FIRM_LINK = null;

        IHttpActionResult expectedResult = await controller.Post(aPI_FIRM_LINK);
        //act

        IHttpActionResult result = await controller.Post(API_FIRM_LINK, aPI_FIRM_LINK);


        ////Assert
        IComparer<IHttpActionResult> comparer = new IHttpActionResultComparer();
       // Assert.IsTrue(comparer.Equals(expectedResult, result));

        Assert.IsNotNull(result);
        Console.Write(result);

【问题讨论】:

  • 不要使用async void
  • 您在这里遇到的问题是什么?
  • 谢谢.. 老实说我是新手 - 我正在尝试设置测试,但不确定如何使用一种方法来检查其是否正常工作
  • This SO answer 提供了一些关于为什么 async void 在单元测试中不起作用的见解
  • 控制台结果 = System.Threading.Tasks.Task'1{System.Web.Http.IHttoActionResult ] 到目前为止

标签: c# unit-testing async-await


【解决方案1】:

如果您使用Microsoft.VisualStudio.TestTools.UnitTesting 的现代版本,您可以使用异步测试方法,就像您在问题中所做的那样。

如果您想测试您的 Post 函数是否返回预期数据,请执行以下操作:

[TestMethod()]
public async Task PostTestAsync()
{
    var controller = new API_FIRM_LINKController();
    // TODO: do some preparations, so you can expect a specific return value
    IHttpActionResult expectedResult = ...

    // call PostAsync and await for it to finish
    Task taskPost =  controller.PostAsync(API_FIRM_LINK, aPI_FIRM_LINK);
    IHttpActionResult result = await taskPost;

    // of course this can be done in one line:
    IHttpActionResult result = await controller.PostAsync(API_FIRM_LINK, aPI_FIRM_LINK);

    // compare whether result equals expectedResult
    // for example: create a class that implements IComparer<IHttpActionResult>
    IComparer<IHttpActionResult> comparer = new IHttpActionResultComparer();
    Assert.IsTrue(comparer.Equals(expectedResult, result);
}

如果您使用无法使用异步测试的测试套件:

[TestMethod()]
public void PostTest()
{
    var controller = new API_FIRM_LINKController();
    IHttpActionResult expectedResult = ...

    // call PostAsync and wait for it to finish
    Task taskPost =  Task.Run(() => controller.PostAsync(API_FIRM_LINK, aPI_FIRM_LINK));
    taskPost.Wait();
    IHttpActionResult result = taskPost.Result;

    // TODO: compare result with expected result
}

【讨论】:

  • 我尝试进行一些调整,因为其中大部分都已损坏且无法构建。 await controller.PostAsync(API_FIRM_LINK, aPI_FIRM_LINK) 得到以下消息: API_FIRM_LINK is a type - not valid 。并且 aAPI_FIRM_LINK 不存在。
  • 我只是从您问题的代码中复制粘贴了对 Post 方法的调用。我所做的唯一更改是将其重命名为 PostAsync,以匹配更常见的异步函数名称。我假设你知道如何编程并且可以看穿这个小小的变化。当然,如果您的代码称为 Post,您应该使用 Post!
  • 我是新手..所以我正在做一些研究。感谢您的帮助
  • 这个“异步任务”解决了我尝试 2 小时的问题。实际上未能确定问题出在哪里。非常感谢 Harald。
【解决方案2】:

从不async void,基本上。

[TestMethod]
public async Task PostTest() {...}

如果您的测试框架不支持 Task 测试:更改测试框架。

【讨论】:

  • 但是我怎么能写一个测试来检查它是否正常工作-
  • @usertestREACT await Task.Delay(500); Assert.Fail(); - 如果没有失败,说明它不起作用
  • 等待控制器。Post(API_FIRM_LINK aPI_FIRM_LINK);此处的错误:API_FIRM_LINK 是在给定上下文中无效的类型
  • 控制台结果 = System.Threading.Tasks.Task'1{System.Web.Http.IHttoActionResult ] 到目前为止
猜你喜欢
  • 2016-02-11
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多