Вопрос

Я хотел бы провести тестирование на высоком уровне моего приложения 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 для тестирования системы моего веб -сервера, включая публикацию данных по мере необходимости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top