结账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 –