我想对我的 mochiweb 应用程序进行高级测试,就像可以在 Python 中使用 WebTest、在 Django 中使用测试客户端以及在 Ruby on Rails 中进行功能或集成测试一样。我不太挑剔如何去做。基本上我只想发送或模拟 HTTP 请求并对结果做出断言。
我重构了我的代码,以便我的请求处理程序不会调用Req:respond()
自己,而是返回一个 tuple {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 应用程序进行功能或集成测试?