rspec'允许'存根不是设置变量

时间:2015-08-13 19:37:15

标签: ruby-on-rails rspec controller stub

我有一个控制器功能:

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?即使该功能是存根的。我可以看到这是因为控制器中的放置。任何想法为什么它不起作用?

1 个答案:

答案 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