我有一个控制器功能:
def update
@simulation = Simulation.find(params[:id])
@simulation.next
puts "--"
puts @simulation.dirty?
puts @simulation.save
if (@simulation.save && @simulation.dirty?)
render :partial => 'show', :object => @simulation
end
end
和rspec测试:
it "should render a partial when the record is dirty" do
allow(@simulation).to receive('dirty?') { true }
put :update, :id => @simulation.id, :format => 'js'
expect(response).to render_template( :partial => 'show' )
end
测试无法呈现视图,因为if检查没有通过,因为它不会为@ simulation#dirty返回true?即使该功能是存根的。我可以看到这是因为控制器中的放置。任何想法为什么它不起作用?
答案 0 :(得分:1)
您正在存根的实例变量@simulation
不属于控制器实例,而是属于rspec测试用例类实例。在允许方法调用之后,在rspec块中尝试@simulation.dirty?
。我猜它会返回true。但是,控制器中的@simulation
不是存根的。它们是两个不同的对象。
如果要在控制器的更新方法中存根@simulation
,则应该存根Simulation类的所有实例。尝试使用allow_any_instance_of而不是allow(@simulation
)。
allow_any_instance_of(Simulation).to receive(:dirty?).and_return(true)
https://github.com/rspec/rspec-mocks#settings-mocks-or-stubs-on-any-instance-of-a-class