RSpec“未定义的局部变量或方法`用户'”

时间:2012-06-03 03:46:01

标签: ruby-on-rails ruby-on-rails-3 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'

我也尝试在两种情况下都将其更改为root_url而不是user_path(user),并且它出现了不同的错误:

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

有谁知道问题可能是什么?我仔细检查了我的代码,并在网上发布了类似的问题,但未能找到解决方案。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

但是,您必须使用Mori建议的assigns :user才能在第二部分中创建实例变量。例如。您不能简单地user_path(:user)user_path(@user)

希望这可以帮助将来的某个人!