0

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'

root_urlまた、これを代わりに両方のケースに変更しようとuser_path(user)しましたが、次のような別のエラーが発生しました。

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

問題が何であるかを知っている人はいますか?コードを再確認し、同様の質問がオンラインで投稿されているのを見ましたが、解決策を見つけることができませんでした。助けてくれてありがとう!

4

2 に答える 2

1

Rspec Rail の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)
于 2012-06-03T04:13:25.977 に答える
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 :user2番目の部分でインスタンス変数を作成するには、森が提案したようにを使用する必要があります。user_path(:user)EGやを単純に実行することはできませんuser_path(@user)

これが将来誰かに役立つことを願っています!

于 2012-06-03T04:38:37.337 に答える