我想对我的Mochiweb应用进行高级测试,就像可以在Python中使用WebTest,Django和Test Client和Ruby在Raby上进行功能或集成测试的Ruby。我对如何做不太挑剔。基本上,我只想发送或模拟HTTP请求并就结果做出断言。

我重构了代码,以使我的请求处理程序不会打电话 Req:respond() 他们自己,但是又有元组 {Code, Headers, Body}. 。这使我可以通过mochiweb_request:new(), ,将它们传递给我的请求调度员,并使用EUNIT对结果作出主张:

make_request(Method, Path) ->
    Request = mochiweb_request:new(nil, Method, Path, {1, 1},
        mochiweb_headers:make([{"Accept", "text/html"}])),
    Response = myapp:dispatch(Request),
    Response.


signin_test() ->
    {Code, _, _} = make_request('GET', "/signin"),
    ?assertEqual(Code, 200),
    ok.

现在我的问题是如何测试发布请求。我在摩西韦布(Mochiweb)中没有发现任何可以让我这样做的东西。从阅读Mochiweb代码,似乎 Req:parse_post() 被称为,它触发了插座上的读数。我在 src/mochiweb.erl. 。显然,这涉及构建HTTP消息,将其写在插座上并回复响应。我试图在自己的测试代码中执行此操作,但是几个小时后我没有设法到达任何地方。我开始怀疑我是否朝着正确的方向前进。也许我需要从HTTP管道中解脱出更多的功能,即。不打电话 Req:parse_post() 从我的请求处理程序中。我想的另一个解决方案是使用第三方Web测试库,不需要用Erlang编写。也许是红宝石或蟒蛇的东西,甚至是硒。

那么,您建议使用哪种解决方案进行摩西韦布应用程序的功能或集成测试?

有帮助吗?

解决方案

我使用通用测试服务器并进行测试,我使用iBrowse。这是一个示例:

post_cap_query_no_caps(_Config) ->
A="<?xml version=\"1.0\" encoding=\"utf-8\"?><query><capabilities/></query>",
{ok, "200", _C, Body}=ibrowse:send_req("http://localhost:8000/devices",  XML_CONTENT_TYPE, post, A),
"<devices/>" == Body.

其他提示

我们主要将测试与HTTP管道解放。无论如何,通常在功能环境中要做的正确的事情。

SRC/Mochiweb_multipart.erl中有一些EUNIT代码,可能与您的特定用例更相关。

您为什么不只是使用HTTP客户端来拨打电话?我使用iBrowse来系统测试我的网络机器服务器,包括根据需要发布数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top