[英]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.