2012-06-03 112 views
0

我有以下的測試寫的RSpec:RSpec的「未定義的局部變量或方法'用戶'」

describe '#create' do 
    ... 
    it 'redirects users to profile page' do 
    response.should redirect_to user_path(user) 
    end 
    ... 
... 

並在下面我UsersController

def create 
    @user = User.new(params[:user]) 
    if @user.save 
    redirect_to user_path(@user) 
    end 
end 

有誰知道這是爲什麼返回以下錯誤:

NameError: undefined local variable or method 'user'

我也試過ç掛這是在兩種情況下,而不是user_path(user)root_url,它給了一個不同的錯誤說:

Expected response to be a <:redirect>, but was <200>

有誰知道這個問題可能是什麼?我已經仔細檢查了我的代碼,並在網上發佈了類似的問題,但一直未能找到解決方案。預先感謝任何幫助!

回答

0

事實證明,assigns只是創建一個實例變量,而無需另外post :create不填充它它上面。

所以,以供將來參考,下面是正確的代碼:

it 'redirects to the users profile page' do 
    post :create, user: attributes_for(:user) 
    response.should redirect_to user_path(assigns :user) 
end 

但是,你必須使用assigns :user如森爲了在第二部分中創建實例變量建議。例如。你不能簡單地做user_path(:user)user_path(@user)

希望這可以幫助未來的人!

1

您可以使用Rspec的鐵路的assigns方法來訪問控制器實例變量:

it 'redirects users to profile page' do 
    response.should redirect_to user_path(assigns :user) 
end 

這裏assigns :user相當於controller.instance_variable_get :@user

按@下面Justin的評論,他也錯過了行調用控制器動作:

post :create, user: attributes_for(:user) 
+0

我試着輸入並且現在拋出這個錯誤:'沒有路由匹配{:action =>「show」,:controller =>「users」}'。但是,我在我的routes.rb文件中擁有'resources:users',控制器中的show動作和show view。任何想法爲什麼發生這種情況? – Justin

+0

那麼,在控制器中它應該通過@user的'id',你的意思是在規範中嗎?我檢查了'test.log'文件,似乎用戶正在正確地輸入到數據庫中,但有沒有另一種方法來測試? – Justin

+1

嘗試使用'app.user_path(User.first)'這樣的東西在控制檯中測試'user_path'來查看路由是否按預期工作。 – Mori

相關問題