Выполнение функциональных тестов в рельсах с помощью устройства


После 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 19

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.

В дополнение к коду в test_helpers.rb, я добавил Это в верхней части controller_test, и это сработало для меня:

require 'test_helper'