在测试控制器时与rspec分配混合

时间:2013-02-06 00:23:46

标签: ruby-on-rails rspec controller assign

我正试图掌握测试控制器的问题,到目前为止,我似乎仍然遇到了最简单的问题。

documents.controller:

    def edit
      @document = Document.find(params[:id])
    end

documents_controller_spec:

    describe 'GET #edit', focus: true do
      before(:each) { @doc = FactoryGirl.create(:document)}

      it "should assign @document to the document" do
        get :edit, id: @doc
        assigns(:document).should eq(@doc)
      end
    end

始终返回false。 @document总是分配为nil。我已经尝试将params [id]指定为@ doc.id,但这并没有解决任何问题。我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

从rspec的角度来看,你要比较的两个文件(分配给@doc):

assigns(:document).should eq(@doc)

不一样 - 它们在数据库中具有相同的ID,但是您比较的实际ruby对象是不同的,因为一个是在“之前”块中创建的,而另一个可能是在控制器内部实例化的GET请求在您的测试中执行。

我的猜测是以下工作:

assigns(:document).id.should eq(@doc.id)

答案 1 :(得分:1)

尝试更改

get :edit, id: @doc

get :edit, id: @doc.id

基本上,它只需要id来构建路径。