Выполнение функциональных тестов в Rails с помощью Devise
После 3 лет просрочки сегодня - это день, когда я начинаю тестировать свои приложения Rails. Мой первый шаг - исправить неудачные тесты в моем приложении Rails 3 beta4.
Мои последние 3 неудачных теста связаны с драгоценным камнем разработки и его authenticate_user! метод в файле before_filter в верхней части моего контроллера.
Ты получишь отличную карму, помогая мне в этом, так как теперь я смогу использовать методологию TDD.
Вот ошибка, которая меня беспокоит:
1) Error:
test_should_get_accepted(ModerationControllerTest):
NoMethodError: undefined method `authenticate!' for nil:NilClass
/test/functional/moderation_controller_test.rb:10:in `test_should_get_accepted'
Devise просто дает указатели на функциональные тесты и помощники на этой странице: http://github.com/plataformatec/devise, но я просто не знаю, как применить это в приложении.
Можете ли вы дать этому тесту noob некоторые подробные инструкции о том, как использовать эти помощники?
Ответы
Ответ 1
Мне потребовалось некоторое время, но я нашел путь. Здесь это для тех, кто застрял в одной точке:
В верхней части moderation_controller_test.rb, ниже объявления класса, добавьте следующую строку:
include Devise::TestHelpers
У меня есть 2 записи в моем пользовательском приборе, и я добавил эту строку в каждом тесте, где пользователю разрешено выполнять действие.
sign_in User.first
Конечно, он мертв просто, как только вы знаете, как это сделать.
Ответ 2
Если вы хотите, чтобы помощники теста Devise были доступны для всех ваших тестов, вы должны включить include, упомянутый allesklar в нижней части test_helper.rb
в объявлении класса, например:
class ActionController::TestCase
include Devise::TestHelpers
end
Обновление: 01.25.2017
... rails 5 posts a DEPRECATION WARNING и просит вас использовать...
Devise::Test::ControllerHelpers
Ответ 3
Я относительно новичок в Rails, поэтому я хотел бы добавить пару вещей, которые могут быть неочевидны для других новых людей.
Что касается пользовательского устройства, я должен был определить его, но оставить его пустым, чтобы это работало:
# in users.yml
joe: {}
При использовании помощника sign_in
вы можете получить доступ к хэш-объекту непосредственно в своем тесте:
# a test method in some_controller_test.rb
sign_in users(:joe)
Подробнее о Rails-устройствах см. http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures.
Ответ 4
Цитата из https://github.com/plataformatec/devise:
Если вы используете RSpec, вы можете поместить следующее внутри файла с именем spec/support/devise.rb
:
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
end
Теперь вы можете использовать sign_in
и sign_out
в тестах RSpec.
Ответ 5
В дополнение к коду в test_helpers.rb, я добавил это вверху контроллера_test, и это сработало для меня:
require 'test_helper'