結賬Control.Proxy.Tutorial。如果你可以寫在你的類型代理的包裝,那麼你就可以輕鬆更換測試接口和一個真正的接口是這樣的:
client <-< simulatedServer
client <-< realServer
編輯:要回答在評論你的問題,你用Server
寫在你simpleHTTP
要求的包裝:
realServer
:: HStream ty => Request ty -> Server (Request ty) (Result (Response ty)) IO r
realServer = foreverK $ \req -> do
result <- lift $ simpleHTTP req
respond result
模擬服務器看起來像:
simulatedServer
:: (Monad m, HStream ty)
=> Request ty -> Server (Request ty) (Result (Response ty)) m r
simulatedServer = foreverK $ \req -> do
result <- lift $ simulatedRequest req
respond result
和你的客戶會看上去像個E:
client
:: (Monad m, HStream ty) =>() -> Client (Request ty) (Result (Response ty)) m r
client() = forever $ do
let req = <something>
result <- request req
lift $ doSomethingWith result
然後你可以使用測試真實服務器和假服務器:
-- Test the real server
main = runSession $ client <-< realServer
-- Test the fake server
main = runSession $ client <-< simulatedServer
的client
和simulatedServer
是在基礎單子多態不僅是因爲我不知道是什麼單子基地,他們將用於測試。唯一的要求是你構成的兩件事物具有相同的基本monad,或者至少有一個在基本monad中是多態的。
我已經基於VCR的想法開始了一個Haskell項目。貢獻或發送反饋,如果您願意:https://github.com/cordawyn/havcr –