2

我想确保我的清扫器被适当地调用,所以我尝试添加如下内容:

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

我尝试在测试配置中打开缓存,但这没有任何区别。

4

3 回答 3

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 的观察者(sweepers 是观察者的子类)是在 Rails 启动时设置的,所以我们必须使用“instance_variable_set”将我们的sweeper mock 直接插入到模型中。

于 2009-02-18T14:31:06.217 回答
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
于 2012-08-16T03:27:57.747 回答
2

假设你有:

  • 一个FooSweeper班级
  • 具有属性的Foobar

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
于 2013-01-22T17:26:16.573 回答