[英]Haskell: How to test a Spock app that uses wreq?
我使用Spock和wreq在Haskell中編寫了一個非常簡單的應用程序。 我想寫一些測試,但我不知道該怎么做。
所有應用程序都會向另一台服務器發出HTTP請求,並將JSON響應轉換為人性化的消息。 這是代碼,如果它有幫助。 我想編寫一個測試,在給定某個JSON響應的情況下斷言人類友好消息是正確的。
在Ruby中,我會模擬HTTP客戶端,在本例中是wreq
,來控制我得到的JSON響應,但我不確定在Haskell中是如何做到這一點,甚至是否做到這一點。
從我從研究中收集到的,聽起來類似於類型約束的類型變量是可行的方式,這看起來像依賴注入我,但我不確定如何在Spock和WREQ。
Spock測試教程描述了如何在IO Application
級別測試Spock,這聽起來很棒。 我不確定的部分是如何“注入”模擬HTTP客戶端來控制JSON響應。
任何幫助表示贊賞!
如果我們想要支持不同的請求方法,我們必須對它們進行抽象。 您可以讓處理程序接受執行HTTP請求的函數作為參數,然后傳遞不同的函數進行測試和生成。 如果您有多個相關函數,請將它們放在記錄中( 句柄模式 )。
如果我們使用cabal-install > 2.0(使用new- *命令 ),另一種可能的選擇是使用模塊簽名來切換測試套件和最終可執行應用程序之間的實現。 該解決方案還大量使用了Cabal的內部便捷庫功能。
基本思路是:我們將Spock應用程序放在自己的庫中,但不要直接依賴於wreq 。 相反,我們在同一個庫中聲明一個簽名Requests.hsig
如下所示:
signature SomeSpockApp.Requests where
import Data.Aeson (FromJSON)
data Token
doGET :: FromJSON a => String -> Token -> IO a
它定義了用於執行HTTP請求的高級接口。 庫中的代碼將導入此簽名。 對於庫中的其余代碼, SomeSpockApp.Requests
只是另一個模塊。
接下來,我們定義一個便利庫,它將提供一個實際的模塊SomeSpockApp.Requests
(與簽名相同,但現在它是一個hs
文件除外)。 它將包含“模擬”代碼。 當然, doGET
的定義必須與簽名兼容。
我們還使用另一個SomeSpockApp.Requests
模塊定義了另一個便利庫。 這個應該依賴於wreq並使用wreq的函數來實現我們的簽名方法。
在測試套件中 ,我們應該依賴我們的Spock應用程序庫和模擬庫。 簽名和模擬實現模塊的名稱完美排列,因此無需再進行任何操作。 (如果名稱不匹配,我們可以在cabal文件中使用mixins節來重命名模塊)。
在app可執行文件中,我們應該依賴於我們的Spock應用程序庫和使用wreq的庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.