Как импортировать Rails помощники в функциональные тесты - PullRequest
4 голосов
/ 12 ноября 2010

Здравствуйте, я недавно унаследовал проект, в котором бывший разработчик не был знаком с 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

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

Ответы [ 4 ]

1 голос
/ 26 декабря 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
1 голос
/ 09 апреля 2013

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

require_relative '../../app/helpers/import_helper'
1 голос
/ 19 ноября 2010

Единственное решение, которое я нашел, было перефакторинг и использование достойного плагина аутентификации

0 голосов
/ 16 ноября 2013

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

include Devise::TestHelpers

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

sign_in users(:one)

вместо

current_user = users(:one)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...