簡體   English   中英

Haskell 中的模擬數據庫連接

[英]Mock Database connections in haskell

我正在嘗試在 haskell 中編寫一些簡單的代碼,其中有一個函數執行簡單的數據庫查詢。 為了對我使用 HUnit 進行單元測試,但不確定如何模擬數據庫連接和查詢響應。

將執行數據庫查詢的函數作為參數傳遞給您的代碼,而不是“硬連線”。 在測試期間,將模擬函數傳遞給代碼。 在生產中,傳遞一個真正執行數據庫查詢的函數。

這個新的函數參數應該處於正確的抽象級別。 例如,像

queryDbForClient :: Connection -> SQLString -> ClientId -> IO (Maybe RowData)

這可能是一個壞主意,因為它仍然強制被測代碼意識到存在Connection和 SQL 字符串之類的東西。 像這樣的東西

findClientById :: ClientId -> IO (Maybe Client) 

可能會更好,因為這樣您就可以自由傳遞根本不使用特定於數據庫的Connection類型的函數。 例如,它們可以由內存中的引用支持

請注意,您可以通過部分應用程序從queryDbForClient構建findClientById並稍微映射結果。 但這應該是一些設置代碼的任務,而不是您要測試的主要代碼。


一旦為了可測試性和可配置性開始以這種方式傳遞函數,一些常見問題就會開始出現。 例如,如果我有多個依賴項怎么辦? 將它們全部作為位置參數傳遞是一件苦差事。 這可能會導致在函數記錄中將它們一起傳遞,可能使用Has類型類,以免將您的主代碼綁定到任何特定記錄。

暫無
暫無

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

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