【问题标题】:Haskell: Testing web APIsHaskell:测试 Web API
【发布时间】:2012-09-14 12:49:09
【问题描述】:

我一直想知道使用哪些方法(如果有)来测试通过网络发出请求的 Haskell 应用程序?来自 Ruby 领域,我一直在寻找可以存根或“模拟”网络调用以测试 Haskell 函数的任何东西。我对类似“VCR”的解决方案特别感兴趣(例如:https://github.com/myronmarston/vcr),因为它似乎是最可行的选择,恕我直言。

所以,我希望能够记录一次网络请求/响应对,然后将这些记录重复用于后续测试。我想出了我自己的简单组合,在测试之前启动一个 Web 服务器(warp),提供预先录制的响应,但我必须将应用程序中的所有 URL 指向“localhost”。我想,这并不总是可以替换应用程序中的所有 URL。虽然我对上面描述的自己的设置非常满意(并且想稍后用它制作一个专用的测试工具/框架“插件”),但我宁愿不重新发明轮子。

【问题讨论】:

  • 我基于 VCR 的思想开始了一个 Haskell 项目。如果愿意,请贡献或发送反馈:github.com/cordawyn/havcr

标签: testing haskell web


【解决方案1】:

查看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

clientsimulatedServer 在基本 monad 中是多态的,只是因为我不知道他们将使用什么基本 monad 进行测试。唯一的要求是你组成的两个东西有相同的基本单子,或者至少有一个在基本单子中是多态的。

【讨论】:

  • 所以,基本上,我当前的Network.HTTP.simpleHTTP req 在客户端变为Control.Proxy.request req,然后我将Control.Proxy.respond $ Network.HTTP.simpleHTTP req 用于“realServer”,将Control.Proxy.respond $ Simulated.Network req 用于“simulatedServer”。然后我将它们链接起来,如上所示。对吗?
  • @SlavaKravchenko 是的。我编辑了我的答案,为您提供了具体的代码示例,说明如何执行此操作,因为我确切地知道您的想法。
  • 太棒了!非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2013-03-25
相关资源
最近更新 更多