繁体   English   中英

使用NUnit和C#进行异步单元测试

[英]Async unit testing with NUnit and C#

我创建了以下方法,花哨的只是从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#单元测试的新手。

在Nunit Framework中,如下所示在单元测试中使用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, "");
}

有关更多详细信息,请阅读NUnit中的异步支持。

最好在引发异常的情况下测试您的方法NUnit预期的异常

更新:

评论:

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

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

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

    Assert.AreEqual(a, "");

这意味着您期望从a=cc.GetStringFromConsul("")计算出a变量可以通过“”,否则测试将失败,并且NUnit Framework会引发如下异常:

    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的错误,当输入parameter =“”时返回“”

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

我很想知道错误消息,所以我先将assert更改为

Assert.AreEqual("", a);

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

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到您的异步方法调用中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM