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 :user按照 Mori 的建议使用才能在第二部分中创建实例变量。EG 你不能简单地做user_path(:user)or user_path(@user)

希望这对将来的人有所帮助!

于 2012-06-03T04:38:37.337 回答