簡體   English   中英

單元測試REST客戶端

[英]Unit testing a REST client

我對單元測試相當新,但我正在嘗試將其合並到我編寫的任何新代碼(包括錯誤修復)的開發過程中。

我正在使用REST客戶端與Highrise(37Signals)進行通信。 如何在不依賴外部依賴的情況下對此進行單元測試? (REST服務)。

例如,我將有一個名為GetPeople()的方法

我想要進行單元測試的事情......

  1. 該方法返回帳戶中正確的人數。
  2. 如果帳戶中沒有人,則該方法返回null
  3. 如果該方法無法連接到該服務,則會拋出異常。

我該怎么做才能測試該服務的功能是否相同。 IE用戶還有名字嗎? 我可以對此進行單元測試,還是更多的集成測試?

對於那些試圖測試實際的HttpWebRequest和HttpWebResponse而不是模擬的人。 我在這里提到了一種方法: http//nripendra-newa.blogspot.com/2012/10/testing-rest-clients.html 我稱之為集成測試,而不是單元測試。 請參閱此處查看實際實施: https//github.com/nripendra/Resty.Net/blob/master/tests/Resty.Net.Tests/RestRequestTest.cs

該方法:

  • 使用嵌入式Web服務器。 我使用過NancyFx,但你可以使用任何皮艇,卡西尼等。

我假設您的代碼現在直接使用HttpWebRequestHttpWebResponse 如果是這種情況,用IRequest替換所有出現的HttpWebRequest和用IResponse替換HttpWebResponse 定義了這兩個接口並公開了您需要的屬性和方法,如下所示:

public interface IRequest
{
    IResponse GetResponse(string url);
    IResponse GetResponse(string url, object data);
}

public interface IResponse
{
    Stream GetStream();
}

然后它只是兩次實現這些接口; 一次用於真正的應用程序(使用HttpWebRequestHttpWebResponse來執行HTTP操作)和一次用於測試(不使用HTTP,而是可能寫入控制台,日志或類似的東西)。

然后,在實例化您的客戶端時,只需注入您想要的IRequest實現:

var realClient = new Client(new MyHttpRequest());
var testClient = new Client(new MyTestRequest());

對與外部REST API交互的單元測試代碼來說,這是一個非常常見的要求。 模擬API服務器實際上通常很煩人,因為大多數Web框架需要大量配置才能開始模擬端點。 例如NancyFX和Asp.net。

除此之外,斷言發送到服務器的數據可能非常困難 - 這實際上意味着您只能檢查響應是否正確處理。

即使在真實端點上進行集成測試,也無法測試當您使用的API發生故障時會發生什么情況,或者輸出異常狀態代碼,因為您無法控制端點。

經過很長一段時間試圖找到這個問題的解決方案后,我決定使用基於內置HttpListener類的真實Web服務器編寫一個用於模擬API端點的庫。

https://github.com/paulmorrishill/FluentSimulator

該庫支持模擬端點,標頭,響應,響應緩慢,響應失敗。 HTTP端點上可能發生的每種類型的事件。

它還允許聲明發送到服務器的數據完全符合您的預期。

這是使用模擬對象的教科書示例。 所以你要做的就是實現一個模擬你期望的行為的假服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM