Создание функциональных тестов в Rails с Devise - PullRequest
19 голосов
/ 06 июля 2010

Сегодня, после 3 лет проволочек, я начинаю тестировать свои приложения на Rails. Мой первый шаг - исправить неудачные тесты в моем приложении Rails 3 beta4.

Мои последние 3 провальных теста связаны с гемом devise и его 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 ]

51 голосов
/ 07 июля 2010

Мне потребовалось некоторое время, но я нашел способ.Вот для любого, кто застрял в одной точке:

В верхней части moderation_controller_test.rb, ниже объявления класса, добавьте эту строку:

include Devise::TestHelpers

У меня есть 2 записи в моемпользовательский прибор и я добавили эту строку в каждый тест, где пользователь должен быть авторизован для выполнения действия.

sign_in User.first

Конечно, это очень просто, если вы знаете, как это сделать.

19 голосов
/ 04 августа 2011

Если вы хотите, чтобы помощники по тестированию Devise были доступны для всех ваших тестов, вы должны заключить упоминание allesklar в конце test_helper.rb в объявление класса, например:

class ActionController::TestCase
  include Devise::TestHelpers
end

Обновление: 25.01.2017

... rails 5 публикует ПРЕДУПРЕЖДЕНИЕ ОТКЛОНЕНИЯ и просит вас использовать ...

Devise::Test::ControllerHelpers

7 голосов
/ 10 ноября 2010

Я относительно новичок в 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 для получения дополнительной информации о светильниках Rails.

1 голос
/ 14 ноября 2013

Дословная цитата из 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.

0 голосов
/ 12 июня 2013

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

require 'test_helper'
...