2010-11-30 2 views
3

После завершения листинга Listing 10.40 и работает Rspec /spec/controllers/users_controller_spec.rb, я получил 1 отказ в разделе (все остальные тесты в разделе «уничтожить» пропускаются)Рубин на Rails Tutorial раздел 10.4.2 Испытание терпеть неудачу

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

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

<% if current_user.admin? %> 

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

Попробуйте заменить, что с

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

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

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

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


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

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

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

Однако, это может быть необходимо поставить

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

В перед фильтром (заметьте, мы проверить на CURRENT_USER прежде, чем видеть, если он администратор).

+0

Можете ли вы уточнить, где именно я должен заменить, что, то есть контроллер, модель ...? Если я прокомментирую этот тест, все остальное будет зеленым. – 2010-11-30 15:02:11

+0

Попробуйте отредактированное решение. Надеюсь, что это очистит? – 2010-11-30 15:26:02

5

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

1

Я читал этот учебник, и я тоже столкнулся с этим неудачным тестом.

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

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

вместо:

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

в users_controller.rb

Смежные вопросы