Haskell:测试Web API

Sla*_*nko 6 testing haskell web

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

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

Gab*_*lez 2

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

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