4

Salut J'ai récemment hérité d'un projet dans lequel l'ancien dev n'était pas familier avec les rails, et a décidé de mettre beaucoup de logique importante dans les aides de vue.Comment importer les assistants Rails dans les tests fonctionnels

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

Gestion de session spécifique. C'est correct et je travaille avec l'application mais j'ai des problèmes pour écrire des tests.

Un exemple spécifique. Certaines des actions font un before_filter pour voir si un current_user est un admin. Cette current_user est normalement fixé par une méthode sessions_helper partagée dans tous nos contrôleurs Ainsi, afin de tester correctement nos contrôleurs que je dois être en mesure d'utiliser cette méthode current_user

J'ai essayé:

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 

la require trouve le session_helper.rb correct mais sans la magie Rails il est accessible de la même manière avec la AppsControllerTest

Comment puis-je modifions cette configuration fou pour tester?

+2

faire 'include SessionsHelper' dans la classe' AppsControllerTest' n'aide pas? Si vous allez développer activement cette application, je vous recommande fortement de refactoriser le code écrit par eux, cela n'a pas de sens, vous gagnerez du temps. On dirait que vous essayez simplement de le faire fonctionner et n'avez pas le temps d'investir dans cela. – Jeremy

+0

Il semble donc que les helpers sont inclus car le contrôleur App appelle une méthode dans user_helper qui déclenche alors une erreur dans l'hôte sessions_helper. Donc, il semble qu'ils sont inclus, mais ne peuvent pas parler les uns avec les autres.Z – kevzettler

Répondre

1

La seule solution que j'ai trouvé était de nouveau facteur et d'utiliser un plugin auth décent

+1

Devise a travaillé pour moi. –

1

Pourquoi re-facteur? Vous pouvez très facilement inclure des aides de votre projet dans vos tests. J'ai fait ce qui suit pour le faire.

require_relative '../../app/helpers/import_helper' 
-1

Pour pouvoir utiliser dans vos tests Concevoir, vous devez ajouter

include Devise::TestHelpers 

à chaque instance ActionController::TestCase. Ensuite, dans la méthode setup vous

sign_in users(:one) 

au lieu de

current_user = users(:one) 

Tous vos tests fonctionnels devraient fonctionner correctement, alors.

+0

La question d'origine indique que le dispositif n'est pas utilisé. – kevzettler

+0

Je supposais que vous utilisiez Devise depuis la variable commune 'current_user'. Au fait, vous n'avez jamais dit que vous n'utilisiez pas Devise. Désolé pour le malentendu. – marzapower

1

Si vous voulez tester les aides, vous pouvez suivre l'exemple ici:

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

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

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

C'est pour les tests unitaires sur les méthodes individuelles. Je pense que si vous voulez tester à un niveau supérieur, et vous allez utiliser plusieurs contrôleurs w/Redirects, vous devez utiliser un test d'intégration:

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

À titre d'exemple:

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 
Questions connexes