2009-05-07 3 views
5

J'ai un certain nombre de contrôleurs dans mes applications Ruby on Rails avec un gestionnaire de secours à la fin de l'action qui attrape fondamentalement toutes les erreurs non gérées et renvoie une sorte d'erreur "conviviale". Cependant, lorsque je fais un test de rake, j'aimerais que ces gestionnaires de secours par défaut soient désactivés afin que je puisse voir l'erreur complète & trace de la pile. Y a-t-il un moyen automatisé de le faire?Comment désactiver les gestionnaires de secours dans les applications Ruby on Rails lorsque j'exécute des tests fonctionnels?

Mise à jour pour clarifier: J'ai une action comme celle-ci:

def foo 
    # do some stuff... 
rescue 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 

Maintenant, quand je test fonctionnel cela, si l'exception est soulevée alors je vais obtenir un peu d'informations sur les l'exception, mais ce que je voudrais, c'est qu'il agisse comme s'il n'y avait pas de gestionnaire de secours, donc je reçois l'information de débogage complète.

Mise à jour: SOLUTION

Je l'ai fait:

rescue: 
    raise unless Rails.env.production? 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
    end 

Répondre

9

Pas tout à fait automatisé, mais comment modifier votre code pour relancer des exceptions lorsqu'il est appelé dans un test?

Peut-être quelque chose comme ceci:

def foo 
    # do some stuff... 
rescue 
    raise if ENV["RAILS_ENV"] == "test" 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 
+0

bien je vais essayer ça! –

+3

relance si Rails.env.test? est plus propre IMO – Scott

+0

@Steven cela ne sauve pas vraiment seulement dans la production. Il soulève où il est .. mais si vous avez 20 lignes de code dans le truC#do alors l'augmentation ne donne aucune référence à cela. La trace indique l'erreur survenue sur la ligne sur laquelle la relance est activée. – baash05

0

Avez-vous envisagé d'utiliser l'appel et l'impression assert_raise(exception1, exception2, ...) { block } puis l'exception du bloc?

0

Quelle méthode utilisez-vous? Il existe deux méthodes de récupération dans ActionController.

J'ai dans mon contrôleur de base:

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
     format.html { render_optional_error_file response_code} 
     format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
end 

fin

Cela ne affiche des erreurs personnalisées en mode de production.

+0

Pourquoi il ne fonctionne qu'en mode de production? Je ne vois pas ça. –

-1

Vous ne devriez pas avoir besoin de désactiver votre bloc de sauvetage. Utilisez la méthode assert_raise (comme suggéré par Scott), et dans le bloc, appelez la méthode que vous attendez d'une exception.

Par exemple:

def test_throws_exception 
    assert_raise Exception do 
    raise_if_true(true) 
    end 
end 
+0

Je n'essaie pas d'affirmer une exception, je sais tout sur comment faire cela et l'ai fait à plusieurs reprises. J'essaie d'obtenir des informations complètes sur les exceptions qui se produisent lorsque je ne les attend pas (y compris la trace de la pile), mais seulement lorsque je suis en mode test. –

+0

Ah. Pardon. J'ai mal compris ce que vous essayiez d'accomplir. –

0

Je pense que la chose la plus facile à faire est de vérifier que la bonne génération était called-- ou tout ce qui était différent du cas régulier, non exceptionnel.

Questions connexes