Тестирование уборщика с RSpec в Rails - PullRequest
2 голосов
/ 16 февраля 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 18 февраля 2009

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

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 (свиперы являются подклассом наблюдателей) устанавливаются при загрузке Rails, поэтому мы должны вставить наш макет свипера непосредственно в модель с помощью instance_variable_set.

2 голосов
/ 22 января 2013

Если у вас есть:

  • a FooSweeper класс
  • a 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
2 голосов
/ 16 августа 2012

Подметальные машины являются синглетонами и создаются в начале теста 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
...