PDA

View Full Version : [RSpec/Rails] Verifica metodo controller


dawid999
27-09-2010, 13:21
Ciao a tutti,
sto utilizzando Rspec da poco per effettuare i test sulle applicazioni Rails e mi trovo un po' in difficolta' nella situazione in cui devo semplicamente verificare il funzionamento corretto di un metodo del controller.
Il metodo (checkout) come prima operazione effettua una ricerca dei prodotti dove "quantity" sia diverso da nil:
@products=Product.find(:all, :conditions => "quantity IS NOT NULL")
successivamente effettua un calcolo matematico sul prezzo di tutti i prodotti trovati,li somma e associa tale somma a @total

Per effettuare il test, nella spec del controller richiamo il metodo mediante controller.nome_metodo e mi aspetto che il valore di @total sia 6 , esempio:


describe ProductsController do

describe "Vengono scelti dei prodotti" do
it "dovrebbe restituire la somma" do
controller.checkout
assigns(:total).should == 6
end
end
end



Naturalmente il db reale dell'applicativo non contiene alcun tipo di dati e quindi la query non restituisce alcun risultato (@products = nil) per questo ho implementato un DB finto grazie a Factory Girl:

Factory.define :product do |a|
a.add_attribute :id, 1
a.add_attribute :name, 'test'
a.add_attribute :price, 2
a.add_attribute :quantity, 3
end

Il quale funziona perfettamente, infatti testando la seguente condizione:

describe ProductsController do

describe "Verifica factory girl" do
it "name dovrebbe essere test" do

product = Factory(:product)
product.name.should == "test"

end
end
end

il test va a buon fine.
La mia domanda e': come posso fare in modo che la query presente nel controller venga eseguita sul db di test/finto di factory girl invece che sul modello activerecord?o forse dovrei indicare in qualche modo al modello di interagire con factory girl invece del db reale?
Spero di essere stato chiaro :)
Grazie

dawid999
27-09-2010, 13:34
ps: il test se eseguito con i valori prelevati dal db reale funziona correttamente ma non e' questo il modo corretto di testare l'applicativo :)

dawid999
27-09-2010, 20:13
Mi auto rispondo perche' ho trovato la soluzione e potrebbe tornare utile a qualcuno.
Il test corretto e' in realta' banale:

@product = [Factory.build(:product)]
Product.stub!(:find).and_return(@product)
get :checkout, :params => @product
assigns(:total).should == 2