2009-02-15 5 views
2

Я хочу, чтобы убедиться, что мой уборочным вызываются в зависимости от обстоятельств, поэтому я попытался добавить что-то вроде этого:Тестирование дворника с RSpec в Rails

it "should clear the cache" do 
    @foo = Foo.new(@create_params) 
    Foo.should_receive(:new).with(@create_params).and_return(@foo) 
    FooSweeper.should_receive(:after_save).with(@foo) 
    post :create, @create_params 
end 

Но я просто получаю:

<FooSweeper (class)> expected :after_save with (...) once, but received it 0 times 

I «Я попытался включить кеширование в тестовом конфиге, но это не имело никакого значения.

ответ

3

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

'after_save' - это метод экземпляра. Вы настраиваете математическое ожидание метода класса, поэтому он не работает.

Следующая это лучший способ я нашел, чтобы установить это ожидание:

it "should clear the cache" do 
    @foo = Foo.new(@create_params) 
    Foo.should_receive(:new).with(@create_params).and_return(@foo) 

    foo_sweeper = mock('FooSweeper') 
    foo_sweeper.stub!(:update) 
    foo_sweeper.should_receive(:update).with(:after_save, @foo) 

    Foo.instance_variable_set(:@observer_peers, [foo_sweeper])  

    post :create, @create_params 
end 

Проблема заключается в том, что наблюдатели Foo в (подметальные являются подклассом наблюдателей) устанавливаются, когда Рельсы сапоги, так что у нас есть чтобы вставить нашу подметальную машину в исходную модель с помощью 'instance_variable_set'.

2

Подметальные машины - это синглтоны и создаются в начале теста rspec. Таким образом, вы можете добраться до него через MySweeperClass.instance(). Это работает для меня (Rails 3.2):

require 'spec_helper' 
describe WidgetSweeper do 
    it 'should work on create' do 
    user1 = FactoryGirl.create(:user) 

    sweeper = WidgetSweeper.instance 
    sweeper.should_receive :after_save 
    user1.widgets.create thingie: Faker::Lorem.words.join("") 
    end 
end 
2

Предполагая, что вы есть:

  • FooSweeper класса
  • Foo класса с bar атрибутом

foo_sweeper_spec.rb:

require 'spec_helper' 
describe FooSweeper do 
    describe "expiring the foo cache" do 
    let(:foo) { FactoryGirl.create(:foo) } 
    let(:sweeper) { FooSweeper.instance } 
    it "is expired when a foo is updated" do 
     sweeper.should_receive(:after_update) 
     foo.update_attribute(:bar, "Test") 
    end 
    end 
end 
Смежные вопросы