我想确保我的清扫工具被正确调用,所以我尝试添加这样的东西:
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
我尝试在测试配置中启用缓存,但这没有任何区别。
答案 0 :(得分: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
问题是当Rails启动时,Foo的观察者(扫描者是观察者的子类)被设置,所以我们必须使用'instance_variable_set'将我们的sweeper mock直接插入到模型中。
答案 1 :(得分: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 :(得分: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