我在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>
有谁知道问题可能是什么?我仔细检查了我的代码,并在网上发布了类似的问题,但未能找到解决方案。在此先感谢您的帮助!
答案 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)
。
希望这可以帮助将来的某个人!