我的规格如下:
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没有为我重新加载?
答案 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