Выполнение функциональных тестов в рельсах с помощью устройства
После 3 лет прокрастинации сегодня я начинаю тестировать свои приложения Rails. Моим первым шагом является исправление неудачных тестов в моих Rails 3 beta4 приложение.
Мои последние 3 неудачных теста имеют отношение к devise gem и его 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 но я просто не знаю, как это применить.
Не могли бы вы дать этому тестирующему нубу некоторые подробные инструкции о том, как использовать эти помощники?
5 ответов:
Это заняло у меня некоторое время, но я нашел дорогу. Вот он для тех, кто застрял в одной и той же точке:
В верхней части moderation_controller_test.rb, под объявлением класса добавьте следующую строку:
include Devise::TestHelpers
У меня есть 2 записи в моем пользовательском приспособлении, и я добавил эту строку в каждом тесте, где пользователь должен быть авторизован для выполнения действия.
Конечно, это очень просто, если вы знаете, как это сделать.sign_in User.first
Если вы хотите, чтобы помощники Devise test были доступны для всех ваших тестов, вы должны заключить include, упомянутый allesklar, в нижней части
test_helper.rb
в объявлении класса следующим образом:class ActionController::TestCase include Devise::TestHelpers end
Обновление: 01.25.2017
... rails 5 публикует предупреждение об устаревании и просит вас использовать ...
Devise::Test::ControllerHelpers
Я относительно новичок в Rails, поэтому хотел бы добавить пару вещей, которые могут быть неочевидны для других новичков.
Что касается пользовательского приспособления, я должен был определить его, но оставить его пустым, чтобы это работало:
# in users.yml joe: {}
При использовании помощника devise
sign_in
Вы можете получить доступ к хэш-объекту непосредственно в тесте:# a test method in some_controller_test.rb sign_in users(:joe)
См. http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures для получения дополнительной информации о рельсовых креплениях.
Цитирую дословно из 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.