在完成列出Listing 10.40并运行rspec /spec/controllers/users_controller_spec.rb之后,我得到了1个故障(传递'destroy'部分中的所有其他测试)
describe "DELETE 'destroy'" do
before(:each) do
@user = Factory(:user)
end
describe "as a non-signed-in user" do
it "should deny access" do
delete :destroy, :id => @user
response.should redirect_to(signin_path)
end
end
end
这是控制台输出:
Failures:
1) UsersController DELETE 'destroy' as a non-signed-in user should deny access
Failure/Error: delete :destroy, :id => @user
undefined method `admin?' for nil:NilClass
# ./app/controllers/users_controller.rb:66:in `admin_user'
# ./spec/controllers/users_controller_spec.rb:282:in `block (4 levels) in <top (required)>'
我无法弄清楚教程代码中是否有错误,或者我在某处犯了错误。
答案 0 :(得分:5)
我相信遇到此问题的读者只是在Listing 10.11中引入过滤器前的:destroy
中错过了:authenticate
方法。 (注意:我是这本书的作者。)
答案 1 :(得分:3)
无法确定,但似乎这是教程代码失败的部分
<% if current_user.admin? %>
如果没有人登录该页面,current_user
为零(我假设),因此无法调用admin?
方法。
尝试用
替换它<% if current_user && current_user.admin? %>
(并且同样替换页面上的其他current_user逻辑)。
这有用吗?
另外,如果你注释掉这个测试,那么登录用户的相同测试会通过吗?
在仔细研究之后,忽略上述情况:测试失败,因为在真正的TDD风格下,测试是在代码之前编写的。所以步骤是:
您还没有编写代码来检查用户是否为admin。编写教程中的清单10.41部分中的代码,测试应该通过。
但是,可能需要放
def admin_user
redirect_to(root_path) unless current_user && current_user.admin?
end
在之前的过滤器中(通知我们在查看他是否是管理员之前检查current_user)。
答案 2 :(得分:1)
我正在阅读该教程,我也遇到了这个失败的测试。
检查您是否:
before_filter :authenticate, :only => [:index, :edit, :update, :destroy]
而不是:
before_filter :authenticate, :only => [:index, :edit, :update]
users_controller.rb
中的