2009-11-26 4 views
10

J'essaye de tester mes vues avec RSpec. Le point de vue particulier qui me cause inquiète, ce change son apparence en fonction d'un paramètre url:RSpec View testing: Comment modifier les params?

link_to "sort>name", model_path(:sort_by => 'name') qui se traduit par http://mydomain/model?sort_by=name

Mon point de vue utilise ce paramètre comme ça:

<% if params[:sort_by] == 'name' %> 
<div>Sorted by Name</div> 
<% end %> 

Le RSpec ressemble ceci:

it "should tell the user the attribute for sorting order" do 
    #Problem: assign params[:sort_for] = 'name' 
    render "/groups/index.html.erb" 
    response.should have_tag("div", "Sorted by Name") 
end 

Je voudrais tester ma vue (sans contrôleur) dans RSpec mais je ne peux pas obtenir ce paramètre er dans ma variable params. J'ai essayé assign dans toutes les saveurs différentes:

  • assign[:params] = {:sort_by => 'name'}
  • assign[:params][:sort_by] = 'name'
  • ...

sans succès jusqu'à présent. Chaque idée est appréciée.

Répondre

10

C'est parce que vous ne devriez pas utiliser params dans vos vues.
La meilleure façon que je vois pour utiliser une aide.

<div>Sorted by <%= sorted_by %></div> 

Et dans l'un de vos fichiers d'aide

def sorted_by 
    params[:sorted_by].capitalize 
end 

Ensuite, vous pouvez tester vos aides assez facilement (car dans les tests d'aides, vous pouvez définir la

demande params.
+0

Pas ce que je m'attendais, mais il a résolu mon problème et amélioré mon application. Merci! – sebastiangeiger

33

Si son contrôleur test alors il serait

controller.stub!(:params).and_return {} 

Si son un test d'aide alors il serait b e:

helper.stub!(:params).and_return {} 

Et son test de vue, il serait:

view.stub!(:params).and_return {} 

Si vous obtenez avertissement comme ci-dessous.

Deprecation Warnings: 

Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from /home/akbarbin/Documents/Office/projects/portfolio/spec/views/admin/waste_places/new.html.erb_spec.rb:7:in `block (2 levels) in <top (required)>'. 


If you need more of the backtrace for any of these deprecations to 
identify where to make the necessary changes, you can configure 
`config.raise_errors_for_deprecations!`, and it will turn the 
deprecation warnings into errors, giving you the full backtrace. 

1 deprecation warning total 

Finished in 4.86 seconds (files took 4.72 seconds to load) 

Vous pouvez le modifier en

allow(view).to receive(:params).and_return({sort_by: 'name'}) 
+0

J'ai trouvé cela utile, mais j'ai utilisé la syntaxe Rspec 3: 'allow (view) .pour recevoir (: params) .et_return ({action: 'index'})' –

5

Le plus simple est de faire ceci:

helper.params = {:foo => '1', :bar => '2'} 

Mais en général, il est préférable d'être une plus grande intégration-y et non « talon "Valeurs quand c'est faisable. Donc, je préfère utiliser les tests du contrôleur avec integrated_views. Ensuite, vous pouvez spécifier vos paramètres au obtenir, et tester que tout le flux fonctionne, de l'envoi des paramètres au contrôleur, à leur traitement par le contrôleur, et enfin au rendu.

Je préfère également généralement extraire la logique de vue dans les aides, ce qui peut être plus facile à tester.

Par exemple, dire que j'ai une aide appelée selection_list, qui retourne une table de hachage dont la touche « selected_preset » repose sur params [: selected_preset], et par défaut à 42 si une valeur vide est spécifiée pour le param.

Voici un test de contrôleur où nous avons appelé integrate_views (vous pourriez bien sûr faire la même chose avec un test de vue réel, si vous y êtes). Ce test d'intégration m'avertira si une partie de cette fonctionnalité se casse. Mais je voudrais aussi idéalement avoir quelques unité tests pour m'aider exactement cette casse.

Je commencerai par demander à l'assistant d'utiliser une variable d'instance au lieu d'accéder directement aux paramètres. Je vais changer le code ci-dessus en ajoutant une seule ligne directement sous le get, comme suit:

describe '#show' do 
    describe 'selected_preset' do 
    it 'should default to 42 if no value was entered' do 
     get :show, :params => {:selected_preset => ''} 
     assigns[:selected_preset].should == 42 # check instance variable is set 
     response.template.selection_list[:selected_preset].should == 42 

Maintenant, je peux facilement effectuer également un test unitaire d'aide:

describe MyHelper do 
    describe '#selection_list' do 
    it 'should include the selected preset' do 
     assigns[:selected_preset] = 3 
     helper.selection_list[:selected_preset].should == 3 
+0

Il semble que "integra_views" est maintenant déprécié en faveur de "render_views". https://relishapp.com/rspec/rspec-rails/v/2-1/docs/controller-specs/render-views –

1

Une autre méthode de réglage vue params:

controller.request.path_parameters[:some_param] = 'a value'