2013-09-11 2 views
0

У меня есть следующие функции поиска, определенные в моей модели:Правильный способ передать индекс Params теста Rspec

class CoffeeType < ActiveRecord::Base 
    has_many :coffee_items 

    def self.search(search) 
    if search 
     where('name LIKE ?', "%#{search}") 
    else 
     where(nil) 
    end 
    end 
end 

и имеет следующий RSpec тест:

describe "GET index with serach params" do 
     it 'renders a list of Coffee Types' do 
     get :index, {search: "Ame"}, valid_session 
     assigns(:coffee_types).count.should eq(2) 
     end 
    end 

Это, вероятно, в значительной степени тривиальной и я не вижу более широкой картины здесь.

+0

Вы используете заводы или посев ваших тестовой базы данных? – trh

+0

@trh: Нет Я не –

+0

Расхождение между консолью и тестом связано с тем, что когда вы запускаете консоль, если вы не передаете 'RAILS_ENV = test', вы используете базу данных разработки. Запуск тестов будет использовать совершенно другую базу данных (для среды 'test'), поэтому вы получаете 0 результатов, потому что в этой базе данных нет' coffee_types'. – gregates

ответ

0

Смотрите здесь для объяснения настроек RSpec use_transactional_fixtures по умолчанию:

https://www.relishapp.com/rspec/rspec-rails/docs/transactions

Если вы не изменили эту конфигурацию, база данных сбрасывается после каждого примера. Поэтому вам нужно настроить начальное состояние в группе example/example. В вашем случае это может выглядеть примерно так:

describe "GET index with serach params" do 
    before :each do 
    # create two coffee_types that should be found by searching for "Ame" and 
    # one that shouldn't 
    2.times { FactoryGirl.create :coffee_type } 
    FactoryGirl.create :coffee_type, name: "Espresso" 
    end 

    it 'renders a list of Coffee Types' do 
    get :index, {search: "Ame"}, valid_session 
    assigns(:coffee_types).count.should eq(2) 
    end 
end 

Редактировать: Duh! На самом деле код в вашем модельном методе неверен. У вас есть только % подстановочный знак до поисковый запрос. Изменить эту строку на:

where('name LIKE ?', "%#{search}%")

+0

См. Мое редактирование выше. Кроме того, в сущности, имя, которое присваивается на вашем заводе, отличается от имени в коде в OP: это «Mocha», который не будет соответствовать «Ame» даже с дополнительным '%' – gregates

Смежные вопросы