Ruby on Rails Tutorial, раздел 10.4.2, провал теста - PullRequest
3 голосов
/ 30 ноября 2010

После завершения листинга Листинга 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 ]

5 голосов
/ 27 марта 2011

Я считаю, что читатели, сталкивающиеся с этой проблемой, просто пропускают метод :destroy в :authenticate перед фильтром, представленным в Листинг 10.11 . ( Примечание: Я автор книги.)

3 голосов
/ 30 ноября 2010

Не могу сказать наверняка, но похоже, что это часть учебного кода, которая терпит неудачу

<% if current_user.admin? %>

Если никто не вошел на эту страницу, current_user равен нулю (я полагаю) и поэтому не может вызывать метод admin?.

Попробуйте заменить это на

<% if current_user && current_user.admin? %>

(и аналогично заменить другую логику current_user на странице).

Это работает?

Кроме того, если вы закомментируете этот тест, пройдет ли тот же тест с зарегистрированным пользователем?


После более внимательного изучения, не обращайте внимания на вышесказанное: тест не пройден, потому что в истинном стиле TDD тест пишется перед кодом. Sot шаги:

  1. Написать тест
  2. Смотреть, как это не получается
  3. Введите код для прохождения теста
  4. Смотреть тестовый проход

Вы еще не написали код для проверки, является ли пользователь администратором. Напишите код в Листинге 10.41 учебника, и тест должен пройти.

Однако может потребоваться поставить

def admin_user
  redirect_to(root_path) unless current_user && current_user.admin?
end

В фильтре before (обратите внимание, что мы проверяем current_user перед тем, как узнать, является ли он администратором).

1 голос
/ 15 мая 2011

Я читал этот учебник и тоже столкнулся с этим провальным тестом.

Проверьте, есть ли у вас:

before_filter :authenticate, :only => [:index, :edit, :update, :destroy]

вместо:

before_filter :authenticate, :only => [:index, :edit, :update]

в users_controller.rb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...