Ciao a tutti, in questi giorni sto usando un pochino ActiveResource e
volevo
fare dei test, ma purtroppo ci giro attorno senza una soluzione.
Premetto che i test che lavorano su GET, PUT e DELETE funzionano, anche
se
le soluzioni a volte non sono proprio pulite, mentre per il POST non c’è
modo.
Ecco quanto fatto. Prima di tutto creo il Mock. In pratica quando mi
trova
una chiamata con il verbo POST e con l’URI specificata, allora mi
ritorna il
contenuto di @variable (in XML) e la risposta 201, simultando una
chiamata
al web service. Fin qui tutto bene.
ActiveResource::HttpMock.respond_to do |mock|
mock.post
“/locations/buildings.xml?description=new-description&name=new-name”,
{},
@variable, 201
…
end
Ora il problema è che il seguente metodo, quello che uso per creare le mie
risorse, non mi combacia in quanto non manda le informazioni tramite
URI, ma
trasforma la query string in XML ed invia il contenuto nel body della
request. Ecco un esempio per chiarire il tutto.
creazione di una nuova risorsa
Building.new({“name”=>“new-name”,
“description”=>“new-description”}).save
Giustamente, mi dice che non trova il mockup perchè l’URI non coincide.
Questo succedere perchè il metodo save crea sì una chiamata con il verbo
POST all’URI /locations/buildings.xml, ma trasforma la query string in
un
flusso XML, come si può vedere dal messaggio di errore dei test.
ActiveResource::InvalidRequestError: No response recorded for <POST:
/locations/buildings.xml [Content-Typeapplication/xml]
(<?xml version="1.0" encoding="UTF-8"?>
new-homenew-description
)>
Ora, da quel che ho visto non c’è il modo per aggiungere un body al
mockup,
quindi la soluzione era la possibilità di usare i costum methods che
ActiveResource mette a disposizione. In questo caso la query string non
è
codificata in XML.
Building.post(:name, {“name”=>“new-home”,
“description”=>“new-description”})
Purtroppo, il problema qui sta nel fatto che come primo parametro
bisogna
specificare il nome del metodo che verrà attaccato al path dell’URI.
Possiamo quindi creare qualcosa come /locations/buildings/name?..
Nel
mio caso, siccome non mi interessa l’uso di name, ho provato a mettere
nil o
“”, ma mi modifica comunque l’URI path quel che basta per non fare
trovare
il mock. Ad esempio, pur mettendo nil, mi trovo qul cavolo di slash in
più.
Building.post(nil, {“name”=>“new-home”,
“description”=>“new-description”})
/locations/buildings*/*.xml?description=new-description&name=new-name
lo slash non permette il matching
Scusate per il lungo messaggio
–
Andrea R., http://mikamai.com
Writing http://sensejs.wordpress.com/
Collaborating http://therubymine.it
Reading http://stacktrace.it