Sla*_*nko 6 testing haskell web
我一直想知道哪些方法(如果有的话)用于测试通过网络进行请求的Haskell应用程序?来自Ruby的土地,我一直在寻找任何可以存根或"模拟"网络调用以测试Haskell函数的东西.我对类似"VCR"的解决方案特别感兴趣(例如:https://github.com/myronmarston/vcr),因为它似乎是最可行的选择,恕我直言.
因此,我希望能够记录一次网络请求/响应对,然后将这些记录重用于后续测试.我提出了自己的简单混合,在测试之前启动Web服务器(warp),提供预先录制的响应,但我必须将应用程序中的所有URL指向"localhost".我认为,并不总是可以替换应用程序中的所有URL.虽然我对上面描述的我自己的设置非常满意(并希望稍后从中创建一个专用的测试工具/框架"插件"),但我宁愿不重新发明轮子.
查看Control.Proxy.Tutorial。如果您可以围绕您的类型编写一个代理包装器,那么您可以轻松地交换测试接口和真实接口,如下所示:
client <-< simulatedServer
client <-< realServer
Run Code Online (Sandbox Code Playgroud)
编辑:要回答评论中的问题,您可以使用 aServer围绕您的请求编写包装器simpleHTTP:
realServer
:: HStream ty => Request ty -> Server (Request ty) (Result (Response ty)) IO r
realServer = foreverK $ \req -> do
result <- lift $ simpleHTTP req
respond result
Run Code Online (Sandbox Code Playgroud)
模拟服务器如下所示:
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
Run Code Online (Sandbox Code Playgroud)
你的客户看起来像:
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
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下命令测试真实服务器和假服务器:
-- Test the real server
main = runSession $ client <-< realServer
-- Test the fake server
main = runSession $ client <-< simulatedServer
Run Code Online (Sandbox Code Playgroud)
和在基本单子中是多态的client,simulatedServer只是因为我不知道他们将使用什么基本单子进行测试。唯一的要求是您组成的两个东西具有相同的基本单子,或者至少有一个在基本单子中是多态的。
| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |