我想对我的mochiweb应用程序进行高级测试,就像在Python中使用WebTest、在Django中使用测试客户端以及在Ruby on Rails中使用功能或集成测试一样。我对如何做这件事并不太挑剔。基本上,我只想发送或模拟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.现在我的问题是如何测试POST请求。我在mochiweb中找不到任何可以让我这样做的东西。从读取mochiweb代码可以看出,当调用Req:parse_post()时,它会触发对套接字的读取。我在src/mochiweb.erl中发现了一些有趣的测试代码。显然,这涉及到构建HTTP消息,将其写入套接字,然后读回响应。我试着在我自己的测试代码中做到这一点,但几个小时后我什么也没能做到。我开始怀疑我是否走对了方向。也许我需要将我的功能更多地从HTTP管道中解耦出来。而不是从我的请求处理程序中调用Req:parse_post()。我正在考虑的另一个解决方案是使用第三方web测试库,而不是用Erlang编写的。也许是Ruby或者Python,或者甚至是Selenium。
那么,您会推荐哪种解决方案来对mochiweb应用程序进行功能或集成测试?
发布于 2011-01-01 15:53:15
我使用普通的测试服务器,为了进行测试,我使用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.发布于 2011-01-01 01:05:15
我们主要将我们的测试从HTTP管道中分离出来。通常,在函数式环境中做的事情是正确的。
src/mochiweb_multipart.erl中的一些eunit代码可能与您的特定用例更相关。
发布于 2011-01-01 04:28:19
为什么不直接使用http客户端进行调用呢?我使用ibrowse对我的webmachine服务器进行系统测试,根据需要包括POSTing数据。
https://stackoverflow.com/questions/4571197
复制相似问题