【问题标题】:Async unit testing with NUnit and C#使用 NUnit 和 C# 进行异步单元测试
【发布时间】:2018-03-17 15:11:15
【问题描述】:

我创建了以下方法,它只是从 HTTP 服务器检索数据,但它是一个异步方法。

public async Task<string> GetStringFromConsul(string key)
    {
        string s = "";

        // attempts to get a string from Consul
        try
        {
            //async method to get the response
            HttpResponseMessage response = await this.http.GetAsync(apiPrefix + key);

            //if it responds successfully
            if (response.IsSuccessStatusCode)
            {
                //parse out a string and decode said string
                s = await response.Content.ReadAsStringAsync();
                var obj = JsonConvert.DeserializeObject<List<consulValue>>(s);
                s = Encoding.UTF8.GetString(Convert.FromBase64String(obj[0].value));
            }
            else
            {
                s = requestErrorCodePrefix + response.StatusCode + ">";
            }
        } 
        catch(Exception e)
        {
            //need to do something with the exception
            s = requestExceptionPrefix + e.ToString() + ">";
        }

        return s;
    }

然后在测试中我像正常执行时一样调用代码:

[Test]
    public async Task GetStringFromConsulTest()
    {
        ConsulConfiguration cc = new ConsulConfiguration();

        string a = cc.GetStringFromConsul("").GetAwaiter().GetResult();
        Assert.AreEqual(a, "");
    }

但是我得到一个这样的异常而不是任何类型的字符串:

Message:   Expected string length 514 but was 0. Strings differ at index 0.
  Expected: "<Request Exception: System.Threading.Tasks.TaskCanceledExcept..."
  But was:  <string.Empty>

我环顾四周,找到了一些关于此的教程并尝试过,但无济于事。如果有人能指出我正确的方向,我将不胜感激,我对 C# 单元测试还很陌生。

【问题讨论】:

    标签: c# asynchronous nunit


    【解决方案1】:

    我是一个很好的错误消息的坚持者,所以我首先将断言更改为

    Assert.AreEqual("", a);
    

    因为 first 参数是您的期望值。现在它将失败

    Message:   Expected string length 0 but was 514. Strings differ at index 0.
      Expected:  <string.Empty>
       But was: "<Request Exception: System.Threading.Tasks.TaskCanceledExcept..."
    

    ...仍然是一个失败,但一个更明智的信息。

    接下来,按照 M Hassan 的建议,将 await 添加到您的异步方法调用中。

    【讨论】:

      【解决方案2】:

      在 Nunit 框架中,在单元测试中使用 async/await,如下所示:

      [Test]
      public async Task GetStringFromConsulTest()
      {
          ConsulConfiguration cc = new ConsulConfiguration();
          //string a = cc.GetStringFromConsul("").GetAwaiter().GetResult();
          //use await instead
      
          string a = await cc.GetStringFromConsul("");
          Assert.AreEqual(a, "");
      }
      

      更多详情,请阅读Async Support in NUnit

      最好测试你的方法以防触发异常NUnit expected exceptions

      更新:

      评论:

      即使像这样构造方法,我仍然会收到错误。

      该错误意味着测试失败并且源代码方法GetStringFromConsul中存在错误。

      您的测试方法包括 Assert 语句:

          Assert.AreEqual(a, "");
      

      这意味着您期望从a=cc.GetStringFromConsul("") 计算的a 变量应该是“”通过, 否则测试失败并且 NUnit 框架会触发一个异常,例如:

          Message:   Expected string length 514 but was 0. Strings differ at index 0.
            Expected: "<Request Exception: System.Threading.Tasks.TaskCanceledExcept..."
            But was:  <string.Empty>
      

      要解决这个异常,你应该解决方法GetStringFromConsul中输入参数=""时返回""的bug

      【讨论】:

      • 即使像这样构造方法,我仍然会收到错误。
      【解决方案3】:

      也许this.http.GetAsync(apiPrefix + key); 正在超时。那会给你一个TaskCanceledException。不确定您的 apiPrefix 值是多少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-17
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 2018-10-20
        相关资源
        最近更新 更多