Все тесты Ruby поднимают: неопределенный метод `authenticate 'для nil: NilClass - PullRequest
129 голосов
/ 30 ноября 2010

Большинство моих тестов показывают следующее, и я не понимаю, почему. Все вызовы методов вызывают ошибку «authenticate». Я проверил код, если есть метод с именем «authenticate», но такого метода нет.

  1) Admin::CommentsController handling GET to index is successful
     Failure/Error: get :index
     undefined method `authenticate!' for nil:NilClass
     # ./spec/controllers/admin/comments_controller_spec.rb:9:in `block (3 levels) in <top (required)>'


  124) PostsController handling GET for a single post should render show template
     Failure/Error: get :show, :year => '2008', :month => '01', :day => '01', :slug => 'a-post'
     undefined method `authenticate' for nil:NilClass
     # ./app/controllers/application_controller.rb:18:in `set_current_user_for_model'
     # ./spec/controllers/posts_controller_spec.rb:131:in `do_get'
     # ./spec/controllers/posts_controller_spec.rb:140:in `block (3 levels) in <top (required)>'

Проект можно найти там => https://github.com/agilepandas/enki на случай, если вы захотите запустить тесты самостоятельно.

Ответы [ 8 ]

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

На этот вопрос в Twitter ответил @ MatthewClosson

@ jeffehh Вам нужно создать файл spec / support / devise.rb, как указано здесь https://github.com/plataformatec/devise#test-helpers, чтобы включить устройствопомощники по тестированию # ruby ​​

Еще раз спасибо.

72 голосов
/ 29 марта 2012

Я знаю, что вы используете Rspec, но вы можете столкнуться с той же проблемой с Test::Unit. Вам просто нужно добавить помощников по тестированию устройства в test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
7 голосов
/ 14 января 2015

в RSpec

, как упоминал Джеффри В., в своем ответе выше ->, чтобы установить это для всех контроллеров:

RSpec.configure do |config|
  # ...
  config.include Devise::TestHelpers, type: :controller
  # ...
end

однако, если этоотносящиеся только к одной спецификации, вам не обязательно включать помощников для всех спецификаций ваших контроллеров, вы можете просто явно включить этих помощников в один блок описания контроллера:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end
7 голосов
/ 10 октября 2014

Приведенный выше ответ не работает для меня (RSpec 3.1)

См. https://stackoverflow.com/a/21166482/1161743 для решения, которое работало для меня.

Вам необходимо выйти из системы анонимного пользователя перед настройкой переменных:

before :each do
  sign_out :user
end
1 голос
/ 29 июля 2015

У меня были такие же сбои в одном из моих проектов. Он использует Ruby 2.0.0-p598, Rails 3.2.21, RSpec 2.99. Когда я запускаю все спецификации вместе, проблема возникла. Когда я запускал спецификации по отдельности, они проходили. В мои spec / spec_helper.rb включено следующее:

RSpec.configure do |config|
  # ...
  config.include Devise::TestHelpers, type: :controller
  # ...
end

Я добавил следующее к первому описанию в каждом ошибочном файле спецификации. Это не решило проблему:

before :each do
  sign_out :user
end

Ни один не сделал:

after :each do
  sign_out :user
end

Вдохновившись ответом на этот вопрос stackoverflow, я запустил разные комбинации каталогов rspec, чтобы выяснить, какие из них могут мешать друг другу. В конце концов я обнаружил, что звоню:

before() do #note no :each passed to before
  :
end

когда я изменил все вхождения этого на:

before(:each) do
  :
end

Все спецификации прошли без сбоев:

undefined method `authenticate' for nil:NilClass

Надеюсь, это поможет другим.

0 голосов
/ 02 июня 2015

Если вы работаете со спецификацией вида, вы можете заглушить current_user.Это эффективно переопределяет хелпер current_user, вызываемый из вашего представления, на все, что возвращается.Вот как с rspec-3.2.3:

RSpec.describe "projects/show", type: :view do
  before(:each) do
    allow(view).to receive(:current_user).and_return(FactoryGirl.create(:user))
  end

  it "renders attributes in <p>" do
    render
    expect(rendered).to match(/whatever you want to regex match here/)
  end
end
0 голосов
/ 12 июня 2013

Ruby сообщает вам, что метод #authenticate еще не определен для nil.Вы можете сделать это легко:

def nil.authenticate!
  puts "Bingo! Nil is now authentic!"
end

И ошибка исчезнет.

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

Похоже, что есть некоторые обновления исходного кода. ApplicationController указывает, что перед любым запросом должен быть запущен фильтр authenticate_user!. Этот поток предоставляет некоторые сведения о проблемах с ним:

http://groups.google.com/group/plataformatec-devise/browse_thread/thread/f7260ebe2d9f7316?fwc=1

По сути, функция authenticate_user! является частью Rails 3 (с использованием новой функции devise, о которой я мало знаю). Если приложение не может найти модель пользователя (либо из-за проблем с пространством имен, либо по какой-либо другой причине), метод потерпит неудачу. Приложение "enki", с которым вы связались, теперь является приложением Rails 3. Он может испытывать несколько растущих болей, когда преобразуется.

...