簡體   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