Haskell:测试Web API

时间:2012-09-14 12:49:09

标签: testing haskell web

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

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

1 个答案:

答案 0 :(得分:3)

结帐Control.Proxy.Tutorial。如果您可以围绕类型编写代理包装器,那么您可以轻松地交换测试界面和这样的真实界面:

client <-< simulatedServer

client <-< realServer

修改:要在评论中回答您的问题,请使用ServersimpleHTTP次请求撰写包装:

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是什么。唯一的要求是你组成的两个东西具有相同的基础monad,或者至少有一个是基础monad中的多态。