Rspec-core: Exécuter la même spécification plusieurs fois avec des filtres différents

Créé le 8 oct. 2011  ·  3Commentaires  ·  Source: rspec/rspec-core

_Avertissement : Cette demande découle spécifiquement des tests d'acceptation JavaScript avec Capybara. Bien que je puisse voir des cas d'utilisation pour d'autres situations._

Toutes mes applications sont codées de manière à fonctionner correctement avec JS désactivé, mais avec JS activé, vous obtenez de nombreuses fonctionnalités intéressantes pour rendre l'expérience utilisateur plus agréable. De ce fait, du point de vue de l'utilisateur, les interactions sur la plupart des choses sont identiques ; Cependant, je veux tester que cela fonctionne à la fois avec et sans JS.

Ce que j'aimerais, c'est pouvoir définir une sorte d'indicateur pour dire à RSpec d'exécuter la même spécification deux fois avec chaque jeu de filtres. Quelque chose comme:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

Je sais que cela peut être accompli avec des exemples partagés, mais le code résultant n'est pas très élégant.

Il pourrait également être utilisé si vous vouliez tester sans JS (Rack test) avec JS sur Firefox (Selenium) et avec JS sur Webkit (capybara-webkit) comme ceci :

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

J'envisage également un moyen d'utiliser des filtres personnalisés pour spécifier les options run_with afin que ce ne soit pas aussi détaillé que :

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

Les pensées? J'ai parcouru la documentation et le code et je n'ai pas vu de moyen de le faire actuellement avec des filtres.

Commentaire le plus utile

Les filtres ne sont pas vraiment conçus pour le faire directement, mais il n'est pas difficile d'obtenir le comportement que vous demandez sans que nous apportions des modifications à RSpec :

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

S'il s'agit d'un modèle courant dont vous avez besoin, vous pouvez créer une petite méthode DSL pour cela :

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

Ensuite, vous pouvez utiliser cette méthode comme ceci :

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

Je pense que c'est assez élégant. Changer le fonctionnement des filtres pour faire ce que vous demandez serait un changement assez important qui ajouterait une charge de maintenance future à l'équipe RSpec pour une fonctionnalité que je pense être rarement utilisée, donc mon instinct est de ne pas l'ajouter au noyau .

Cela dit, si vous souhaitez créer une gemme rspec-multi-filters qui offre cette fonctionnalité, n'hésitez pas :).

Tous les 3 commentaires

Les filtres ne sont pas vraiment conçus pour le faire directement, mais il n'est pas difficile d'obtenir le comportement que vous demandez sans que nous apportions des modifications à RSpec :

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

S'il s'agit d'un modèle courant dont vous avez besoin, vous pouvez créer une petite méthode DSL pour cela :

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

Ensuite, vous pouvez utiliser cette méthode comme ceci :

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

Je pense que c'est assez élégant. Changer le fonctionnement des filtres pour faire ce que vous demandez serait un changement assez important qui ajouterait une charge de maintenance future à l'équipe RSpec pour une fonctionnalité que je pense être rarement utilisée, donc mon instinct est de ne pas l'ajouter au noyau .

Cela dit, si vous souhaitez créer une gemme rspec-multi-filters qui offre cette fonctionnalité, n'hésitez pas :).

@myronmarston comme d'habitude, c'était juste mon ignorance de ce que RSpec pouvait faire. Merci d'avoir pris le temps et de clarifier. Je pense que cela fonctionnera bien. :)

:+1: génial

Cette page vous a été utile?
0 / 5 - 0 notes