为什么我必须在rspec规范中重新加载实例变量?

时间:2014-03-03 09:13:26

标签: ruby-on-rails rspec

我的规格如下:

describe 'toggle_approval' do
  before(:each) do
    @comment = Comment.make(id: 55, approved: false)
  end

  it "toggles the visibility of the discussion" do
    post :toggle_approval, id: 55
    #@comment.reload
    @comment.approved.should be_true
  end
end

除非我取消注释重新加载评论的行,否则此规范将失败。为什么rails没有为我重新加载?

2 个答案:

答案 0 :(得分:5)

因为您没有告诉它重新加载您的记录。控制器中的Comment实例独立于规范中设置的@comment变量创建。因此,如果您未明确使用reload,则不会重新加载。如果您希望控制器中的Comment实例与规范中的实例相同,则可以执行一些存根:

Comment.should_receive(:find).with(@comment.id) { @comment }

答案 1 :(得分:1)

要添加到Marek的答案,您还可以像这样调用.reload内联:

it "toggles the visibility of the discussion" do
  post :toggle_approval, id: 55
  @comment.reload.approved.should be_true
end

或使用类似的东西:

it "toggles the visibility of the discussion" do
  expect {
    post :toggle_approval, id: 55
  }.to change {
    @comment.reload.approved
  }.from(...)
   .to(...)
end