Rspec, cosa c'e' di sbagliato?

Controller:

def search
unless params[:data_search].blank?
shop_data = params[:data_search]
@shops = Shop.data_search(shop_data).paginate(:per_page =>
Settings.shops_per_page, :page => params[:page])
else
@shops = Shop.all.paginate(:per_page => Settings.shops_per_page,
:page => params[:page])
end
render :layout => false if request.xhr?
end

controller.spec:

def mock_shop(stubs={})
@mock_shop ||= mock_model(Shop, stubs).as_null_object
end

describe “search” do
context “when name is ‘Test’” do
it “should find shops” do
@name = “Test”
Shop.stub(:search).with(@name) { [mock_shop] }
get :search, :name => @name
assigns(:shops).should eq([mock_shop])
end
end
end

La failure:

Failure/Error: assigns(:shops).should eq([mock_shop])

  expected [#<Shop:0x9f4 @name="Shop_1032">]
       got []

  (compared using ==)

  Diff:
  @@ -1,2 +1,2 @@
  -[#<Shop:0x9f4 @name="Shop_1032">]
  +[]

Cosa sbaglio?

Fai lo stub di .search ma nel controller entri in questa condizione

@shops = Shop.all.paginate(:per_page => Settings.shops_per_page,
:page => params[:page])

Quindi dovresti fare lo stub di all.pagiante per ottenere il risultato
che desideri.
Se usi il mocking di rspec puoi usare stub_chain. Prova con qualcosa
tipo Shop.stub_chain(:all, :paginate).and_return([mock_shop])

On 8 May 2011 14:58, Fabrizio R. [email protected] wrote:

Fai lo stub di .search ma nel controller entri in questa condizione

@shops = Shop.all.paginate(:per_page => Settings.shops_per_page,
:page => params[:page])

Quindi dovresti fare lo stub di all.pagiante per ottenere il risultato che
desideri.
Se usi il mocking di rspec puoi usare stub_chain. Prova con qualcosa tipo
Shop.stub_chain(:all, :paginate).and_return([mock_shop])

Il problema era semplicemente nel parametro sbagliato, deve essere get
:search, :data_search => … e non :name => …
Adesso funziona anche senza fare lo stub di paginate.