我一直想知道哪些方法(如果有的话)用于测试通过网络进行请求的Haskell应用程序?来自Ruby的土地,我一直在寻找任何可以存根或“模拟”网络调用以测试Haskell函数的东西。我对类似“VCR”的解决方案特别感兴趣(例如:https://github.com/myronmarston/vcr),因为它似乎是最可行的选择,恕我直言。
因此,我希望能够记录一次网络请求/响应对,然后将这些记录重用于后续测试。我提出了自己的简单混合,在测试之前启动Web服务器(warp),提供预先录制的响应,但我必须将应用程序中的所有URL指向“localhost”。我认为,并不总是可以替换应用程序中的所有URL。虽然我对上面描述的我自己的设置非常满意(并希望稍后制作一个专用的测试工具/框架“插件”),但我宁愿不重新发明轮子。
答案 0 :(得分:3)
结帐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
您的客户看起来像:
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是什么。唯一的要求是你组成的两个东西具有相同的基础monad,或者至少有一个是基础monad中的多态。