Как проверить приложение MochiWeb?
Вопрос
Я хотел бы провести тестирование на высоком уровне моего приложения MochiWeb, как это возможно сделать в Python с WebTest, в Django с тестовым клиентом и в 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()
Изнутри моих обработчиков запроса. Еще одним решением, о котором я думаю, было бы использовать стороннюю библиотеку веб-тестирования, не необходимую в Эрланге. Может быть, что -то в Ruby или Python или даже, может быть, селен.
Итак, какое решение вы бы порекомендовали провести функциональное или интеграционное тестирование приложения MochiWeb?
Решение
Я использую общий сервер тестирования и для тестирования я использую 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 есть какой -то код юнита, который, вероятно, более актуален для вашего конкретного варианта использования.
Почему бы вам просто не использовать HTTP -клиент для звонков? Я использую ibrowse для тестирования системы моего веб -сервера, включая публикацию данных по мере необходимости.