Как импортировать хелперы Rails в функциональные тесты

Привет, я недавно унаследовал проект, в котором бывший разработчик не был знаком с рельсами, и решил поместить много важной логики в хелперы представлений.

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
  include BannersHelper
  include UsersHelper
  include EventsHelper
end

В частности, управление сессиями. Это нормально и работает с приложением, но у меня проблемы с написанием тестов для этого.

Конкретный пример. Некоторые действия выполняют before_filter, чтобы узнать, является ли current_user администратором. Этот current_user обычно устанавливается методом sessions_helper, который является общим для всех наших контроллеров. Поэтому, чтобы правильно протестировать наши контроллеры, мне нужно иметь возможность использовать этот метод current_user.

Я пробовал это:

require 'test_helper'
require File.expand_path('../../../app/helpers/sessions_helper.rb', __FILE__)

class AppsControllerTest < ActionController::TestCase
  setup do
    @app = apps(:one)
    current_user = users(:one)
  end

  test "should create app" do
    assert_difference('App.count') do
      post :create, :app => @app.attributes
  end
end

Оператор require находит session_helper.rb в порядке, но без магии Rails он недоступен так же, как в AppsControllerTest.

Как я могу подделать эту сумасшедшую установку для тестирования?


person kevzettler    schedule 11.11.2010    source источник
comment
выполнение include SessionsHelper внутри класса AppsControllerTest не помогает? Если вы собираетесь активно разрабатывать это приложение, я настоятельно рекомендую провести рефакторинг кода, написанного ими, это не имеет смысла, вы сэкономите время. Похоже, вы просто пытаетесь поддерживать его в рабочем состоянии, и у вас нет времени вкладывать в это средства.   -  person Jeremy    schedule 12.11.2010
comment
Таким образом, кажется, что помощники включены, потому что контроллер приложения вызывает метод в user_helper, который затем запускает ошибку в session_helper. Таким образом, кажется, что они включены, но не могут разговаривать друг с другом.   -  person kevzettler    schedule 13.11.2010


Ответы (4)


Единственное решение, которое я нашел, заключалось в рефакторинге и использовании приличного плагина аутентификации.

person kevzettler    schedule 19.11.2010

Зачем проводить рефакторинг? Вы можете очень легко включить помощников из вашего проекта в свои тесты. Для этого я сделал следующее.

require_relative '../../app/helpers/import_helper'
person Shawn Deprey    schedule 08.04.2013

Если вы хотите протестировать помощников, вы можете следовать примеру здесь:

http://guides.rubyonrails.org/testing.html#testing-helpers

class UserHelperTest < ActionView::TestCase
  include UserHelper       ########### <<<<<<<<<<<<<<<<<<<

  test "should return the user name" do
    # ...
  end
end

Это для модульных тестов на отдельных методах. Я думаю, что если вы хотите протестировать на более высоком уровне и будете использовать несколько контроллеров с перенаправлениями, вам следует использовать интеграционный тест:

http://guides.rubyonrails.org/testing.html#integration-testing

В качестве примера:

require 'test_helper'
 
class UserFlowsTest < ActionDispatch::IntegrationTest
  fixtures :users
 
  test "login and browse site" do
    # login via https
    https!
    get "/login"
    assert_response :success
 
    post_via_redirect "/login", username: users(:david).username, password: users(:david).password
    assert_equal '/welcome', path
    assert_equal 'Welcome david!', flash[:notice]
 
    https!(false)
    get "/posts/all"
    assert_response :success
    assert assigns(:products)
  end
end
person Chloe    schedule 26.12.2013

Чтобы иметь возможность использовать Devise в своих тестах, вы должны добавить

include Devise::TestHelpers

каждому экземпляру ActionController::TestCase. Затем в методе setup вы делаете

sign_in users(:one)

вместо

current_user = users(:one)

Тогда все ваши функциональные тесты должны работать нормально.

person marzapower    schedule 16.11.2013
comment
В исходном вопросе говорится, что устройство не используется. - person kevzettler; 17.11.2013
comment
Я предположил, что вы используете Devise из-за общей переменной current_user. Кстати, вы никогда не говорили, что не используете Devise. Извините за недопонимание. - person marzapower; 17.11.2013