2012-06-03 114 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

相关问题