Ruby on Rails教程部分10.4.2测试失败

时间:2010-11-30 13:02:44

标签: ruby-on-rails rspec

在完成列出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)>'

我无法弄清楚教程代码中是否有错误,或者我在某处犯了错误。

3 个答案:

答案 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风格下,测试是在代码之前编写的。所以步骤是:

  1. 编写测试
  2. 观看失败
  3. 编写代码以使测试通过
  4. 观看测试通行证
  5. 您还没有编写代码来检查用户是否为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

中的