rspec 'allow' 存根未设置变量

rspec 'allow' stub isn't setting variables

我有控制器功能:

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 检查未通过,因为它不会 return @simulation#dirty 为真?即使该功能已存根。由于控制器中的放置,我可以看到这一点。任何想法为什么它不起作用?

您存根的实例变量 @simulation 不属于控制器实例,而是属于 rspec 测试用例 class 实例。在允许方法调用之后,在 rspec 块中尝试 @simulation.dirty?。我猜 returns 是真的。但是,控制器中的 @simulation 没有存根。它们是两个不同的对象。

如果你想在控制器的更新方法中存根 @simulation,你应该存根模拟的所有实例 class。尝试使用 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