在 Rails 中使用 RSpec 测试扫地机
-
23-08-2019 - |
题
我想确保我的清扫器被适当地调用,所以我尝试添加如下内容:
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
问题是Foo的观察员(清洁工为观察员的一个子类)被设置在Rails的靴子,所以我们必须直接插入我们清扫模拟与“instance_variable_set”模型。
其他提示
清扫是单独且在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
假设你有:
- 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
不隶属于 StackOverflow