2009-02-15 61 views
2

我想确保我的清扫被称为适当的,所以我尝试添加这样的事情:在Rails进行测试使用RSpec清道夫

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

正如你已经提到的缓存必须在环境中启用这个工作。如果它被禁用,那么我下面的示例将失败。在运行时临时启用缓存规范可能是一个好主意。

'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

清扫器是单例,并在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