使用在Rspec 3中对其设置期望的模拟对象来存根类方法的正确方法

时间:2014-01-26 23:27:48

标签: ruby-on-rails ruby rspec

这是一个有效的测试,Rspec告诉我现在错了,因为stub!已被弃用:

it 'paginates the right number of times' do
  mock_thing = mock_model(User)
  User.stub!(:page).and_return(mock_thing)
  mock_thing.should_receive(:per).with(50)
  get :index
end

这样做的正确方法是什么?我尝试了下面的代码,但它失败了:

it 'paginates the right number of times' do
  mock_thing = mock_model(User)
  mock_thing.should_receive(:per).with(50)
  User.stub(:page, mock_thing) do
    get :index
  end
end

# Error:
# RSpec::Mocks::MockExpectationError: Double "User_1001" received unexpected 
# message :[]= with (:expected_from, ...Stacktrace removed

1 个答案:

答案 0 :(得分:1)

问题陈述是:

User.stub!(:page).and_return(mock_thing)

需要修补Object的猴子以支持stub方法。

您可以显式启用should语法来绕过弃用警告,但使用新语法表达此方法的方法是:

allow(User).to receive(:page).and_return(mock_thing)

我没有检查你的例子的其余部分是否合理。