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