2013-02-06 198 views
4

我試圖得到一個測試控制器的句柄,到目前爲止,我似乎被困在最簡單的問題。與rspec混淆,而測試控制器

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。 @文件始終指定爲零。我試過將params [id]指定爲@ doc.id,但這不能解決任何問題。我在這裏做錯了什麼?

回答

5

從RSpec的的角度來看,這兩個文件(分配給@doc)你是比較在行:

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

是不一樣的 - 他們在數據庫中的ID相同,但實際的Ruby對象你正在比較的是不同的,因爲一個是在'before'塊中創建的,而另一個大概是在你的測試中執行GET請求時在你的控制器中實例化的。

我的猜測是下面的工作:

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

Oooooooh!這使得很多意義!我完全忘記了這一點。謝謝! –

1

嘗試改變

get :edit, id: @doc 

get :edit, id: @doc.id 

基本上,它只是需要的ID來構建路線。