如何测试Mochiweb应用程序?
题
我想对我的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来系统测试我的网络机器服务器,包括根据需要发布数据。