Domanda

Vorrei fare dei test di alto livello della mia mochiweb app, come è possibile fare in Python con WebTest, in Django con il client di prova e in Ruby on Rails con i test funzionali o di integrazione. Io non sono troppo esigente su come farlo. Fondamentalmente vorrei solo per inviare o simulare le richieste HTTP e affermazioni make sul risultato.

I refactoring il mio codice in modo che le mie richieste gestore non la chiamerei Req:respond() se stessi, ma restituire un {Code, Headers, Body} tupla. Questo mi permette di costruire le richieste fittizie con mochiweb_request:new(), passarli alla mia richiesta dispatcher e fare affermazioni sul risultato utilizzando 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.

Ora il mio problema è come testare richieste POST. Non ho trovato nulla in mochiweb che mi permettesse di farlo. Dalla lettura del codice mochiweb, sembra che quando Req:parse_post() si chiama, si innesca una lettura su un socket. Ho trovato un po 'di codice di prova interessante in src / mochiweb.erl . A quanto pare questo comporta la costruzione di messaggi HTTP, scrivendoli su un socket e la lettura sul retro risposta. Ho provato a fare questo nel mio codice di prova, ma non sono riuscito a ottenere ovunque dopo un paio d'ore. Sto cominciando a chiedermi se sto andando nella direzione giusta. Forse ho bisogno di disaccoppiare ancora di più la mia funzionalità dall'impianto idraulico HTTP, vale a dire. Non chiamare Req:parse_post() da dentro il mio gestori delle richieste. Un'altra soluzione Sto pensando di sarebbe quella di utilizzare una libreria di test web di terze parti, non è necessario scritto in Erlang. Forse qualcosa in Ruby o Python o anche forse Selenio.

Quindi, quale soluzione mi consiglia di fare test funzionali o l'integrazione di un'applicazione mochiweb?

È stato utile?

Soluzione

Io uso il server di prova comune e per testare io uso iBrowse. Ecco un esempio:

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.

Altri suggerimenti

Il più delle volte a scindere i nostri test dall'impianto idraulico HTTP. Di solito la cosa giusta da fare in un ambiente funzionale in ogni caso.

Non è un codice eunit in src / mochiweb_multipart.erl che è probabilmente più rilevanti per il vostro particolare caso d'uso.

Perché non basta usare un client HTTP per effettuare le chiamate? iBrowse io uso per test del sistema mio server webmachine, compresi i dati di inviare messaggi come necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top