2009-09-02 5 views
1

J'utilise les rails 2.2.2 et je me demande comment je peux définir les valeurs des paramètres pour tester mes méthodes d'assistance.Comment tester les méthodes d'assistance à l'aide de Shoulda et définir les paramètres et les valeurs de demande?

J'ai trouvé quelques exemples pour vous permettre d'exécuter des tests avec des méthodes d'assistance mais cela ne fonctionne pas pour moi lorsque j'utilise directement la valeur request ou params dans la méthode.

require 'test_helper' 

class ProductHelperTest < Test::Unit::TestCase 
    include ProductHelper 

    context 'ProductHelper' do 
    should 'build the link' do 
     assert_equal '', build_link 
    end 
    end 
end 

Lorsque vous utilisez la demande ou de la valeur params je reçois une erreur que la variable locale ou une méthode est définie. Comment pourrais-je définir la valeur?

Erreur lors de l'utilisation de la valeur de la requête et il s'agira des mêmes messages lors de l'utilisation de la valeur params.

1) Error: 
test: ProductHelper should build the link. (ProductHelperTest): 
NameError: undefined local variable or method `request` for #<ProductHelperTest:0x33ace6c> 
    /vendor/rails/actionpack/lib/action_controller/test_process.rb:471:in `method_missing` 
    /app/helpers/products_helper.rb:14:in `build_link` 
    ./test/unit/product_helper_test.rb:10:in `__bind_1251902384_440357` 
    /vendor/gems/thoughtbot-shoulda-2.0.5/lib/shoulda/context.rb:254:in `call` 
    /vendor/gems/thoughtbot-shoulda-2.0.5/lib/shoulda/context.rb:254:in `test: ProductHelper should build the link. ` 
    /vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:94:in `__send__` 
    /vendor/rails/activesupport/lib/active_support/testing/setup_and_teardown.rb:94:in `run` 
+0

rs de la vue? – jonnii

+0

J'essaie de tester le code existant et ils ne transmettent pas les valeurs de la vue et les utilisent directement. Le plus susceptible de réduire le nombre de paramètres pour les fonctions d'affichage. – Vizjerai

Répondre

3

Je suppose que vous avez à se moquer des appels à l'aide request et paramsmocha ou en définissant des objets fantaisie dans votre test:

# Assuming ProductHelper implementation 
module ProductHelper 
    def build_link 
    "#{request.path}?#{params[:id]}" 
    end 
end 

class ProductHelperTest < Test::Unit::TestCase 
    include ProductHelper 

    # mock by defining a method 
    def params 
    { :controller => "test", :id => "23" } 
    end 

    # mock request.path using `mocha` # => "my_url" 
    def request 
    mock(:path => "my_url") 
    end 

    context 'ProductHelper' do 
    should 'build the link' do 
     assert_equal 'my_url?23', build_link 
    end 
    end 
end 

J'espère que cette aide :)

+0

Merci, cette solution fonctionne parfaitement. Une modification que je lui ai apportée pour les paramètres et les fonctions de requête était de renvoyer @request et @params afin que je puisse redéfinir ce qui devrait être retourné dans les configurations de contexte parce que les fonctions ne peuvent être redéfinies qu'une fois par classe. – Vizjerai

+0

Vizjerai - Avez-vous un exemple de cela? J'ai essayé ... @params = {}; def params; @params; fin; Mais continuez à recevoir des erreurs nulles. –

0

Comme une note , si vous utilisez Rails 2.3.x ou quoi que ce soit qui utilise ActionView :: TestCase - alors tout ce que vous avez vraiment besoin de faire est juste d'avoir une méthode params privée définie dans votre test.

par exemple

require 'test_helper' 

class BookmarksHelperTest < ActionView::TestCase 

    context "with an applied filter of my bookmarks" do 
    setup do 
     expects(:applied_filters).returns({:my_bookmarks => true}) 
    end 

    should "not be able to see it when other filters are called using my_bookmarks_filter" do 
     assert_equal other_filters(:my_bookmarks), {} 
    end 
    end 

    private 

    def params 
     {} 
    end 

end 

Vous pouvez même faire un meilleur en définissant params comme méthode de l'intérieur ActionView :: TestCase

0

Cela fonctionne aussi: controller.params = {:filter => {:user_id => 1}

Voici un exemple:

Ne peux-tu pas passer dans le paramete
require 'test_helper' 

class BookmarksHelperTest < ActionView::TestCase 

    def test_some_helper_method 
    controller.params = {:filter => {:user_id => 1} 
    #... Rest of your test 
    end 
end 
Questions connexes