[ruby-it] ActiveResource e post method
Andrea Reginato
andrea.reginato a gmail.com
Mer 3 Set 2008 00:41:05 CEST
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"?>
<building><building>
<static><name>new-home</name><description>new-description</description></static>
</building></building>)>
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 Reginato, http://mikamai.com
Writing http://sensejs.wordpress.com/
Collaborating http://therubymine.it
Reading http://stacktrace.it
More information about the Ml
mailing list