ActiveResource e post method

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 :wink:


Andrea R., http://mikamai.com
Writing http://sensejs.wordpress.com/
Collaborating http://therubymine.it
Reading http://stacktrace.it

Ciao Andrea,
Guarda ai test di questo mio plugin, potrebbero esserti d’aiuto.

-luca

blog: www.lucaguidi.com
Pro-Netics: www.pro-netics.com
Sourcesense - making sense of Open Source: www.sourcesense.com

On Wed, Sep 3, 2008 at 1:46 PM, Luca G. [email protected] wrote:

Ciao Andrea,
Guarda ai test di questo mio plugin, potrebbero esserti d’aiuto.
GitHub - jodosha/acts-as-resource: ActsAsResource combines ActiveRecord and ActiveResource features in *one* class.

-luca

blog: www.lucaguidi.com
Pro-Netics: www.pro-netics.com
Sourcesense - making sense of Open Source: www.sourcesense.com

Grazie Luca, c’ho dato un’occhiata ma non ho trovato una soluzione.
Ieri mi sono anche guardato i test di ActiveResource, ma niente da fare
:slight_smile:

Buona continuazione a Berlin!