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