簡體   English   中英

在Rails中使用RSpec測試清掃器

[英]Testing a sweeper with RSpec in 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

我試過在測試配置中打開緩存,但這沒有任何區別。

正如您已經提到的那樣,必須在環境中啟用緩存才能使其起作用。 如果禁用它,那么下面的示例將失敗。 最好在運行時為您的緩存規范臨時啟用此功能。

“ 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'將清掃器模擬直接插入模型中。

清除程序是Singletons,在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

假設您有:

  • FooSweeper
  • 具有bar屬性的Foo

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM