Rspec-core: Il devrait y avoir un moyen d'exécuter des spécifications uniques dans un groupe partagé de manière isolée

Créé le 20 juil. 2010  ·  10Commentaires  ·  Source: rspec/rspec-core

Voici un exemple de backtrace obtenu en exécutant une suite de spécifications complète qui utilise des groupes de spécifications partagés

8)
RuntimeError in 'Arel Join#each iterates over the rows in any order'

/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/operations/join.rb:14:in `hash'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `[]'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `read'
/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/relation.rb:21:in `each'
/Users/apatterson/git/arel/spec/support/matchers/have_rows.rb:5:in `have_rows'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `call'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `matches?'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/handler.rb:11:in `handle_matcher'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/extensions/kernel.rb:27:in `should'
/Users/apatterson/git/arel/spec/shared/relation_spec.rb:23:
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `instance_eval'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `execute'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:37:in `execute'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:214:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:103:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:23:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/options.rb:152:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/command_line.rb:9:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/bin/spec:5

Il y a quelques problèmes ici.

1) étant donné la trace, je n'ai aucune idée du contexte de la spécification partagée. Aka, où était-il inclus, dans quel fichier était-il inclus, etc. moi.

2) Je voudrais un moyen d'exécuter cette spécification unique de manière isolée dans le contexte qui l'a fait échouer. Je ne sais pas comment faire pour le moment.

Commentaire le plus utile

Vous pouvez exécuter un seul exemple dans un groupe partagé via rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

Tous les 10 commentaires

David, je pense que je pourrais avoir une solution pour cela:

Lorsque "it_should_behave_like" (ou l'alias) est appelé, il définit les métadonnées suivantes sur le ExampleGroup :

Nom du groupe d'exemple partagé.
Chemin du fichier et numéro de ligne de l'appel de la méthode "it_should_behave_like".

Lorsqu'un exemple échoue, RSpec vérifiera si cet exemple existe dans le groupe d'exemples partagé. Si c'est le cas, il ajoutera à la sortie le chemin du fichier et le numéro de ligne (stockés dans les métadonnées ExampleGroup).

Qu'en penses-tu?

Oh sympa je vois que les métadonnées sont déjà là :-)

J'ai fusionné @justinko le patch « (de 3906559d059bcdbd4d15303303c517088b038eeb), qui affiche la ligne qui appelle le groupe partagé, donc nous savons maintenant que le contexte dans lequel il a été exécuté. Cela laisse toujours ouverte la question de l'exécution d'un seul exemple partagé - mais cela devrait au moins aider à comprendre quand un exemple partagé échoue.

Vous pouvez exécuter un seul exemple dans un groupe partagé via rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

Ouais - c'est vrai. C'est assez bon pour moi. Je vais fermer ça. @carllerche si vous pensez que ce n'est pas suffisant, commentez ici et je le rouvrirai.

Merde, j'ai trouvé un bug avec ça :

share_as :MySpecs do
  let(:foo) { described_class # returns nil }

Enquêter.

Je veux déprécier share_as. Il génère un module, que vous utilisez ensuite pour inclure include , ce qui a des implications très différentes de la création d'un groupe imbriqué, comme nous le faisons maintenant avec shared_examples_for . WDYT ?

Je suis tout à fait d'accord pour le déconseiller. Quand j'ai commencé à apprendre RSpec, je ne savais pas pourquoi il y avait shared_examples_for et share_as .

J'ai tendance à utiliser share_as pour le groupe de niveau supérieur :

describe Model do
  include MySharedSpecs

  context 'it works' do
    it_should_behave_like 'a working model'

Je suis passé à shared_examples_for et tout va bien. Merci.

Pour tous ceux qui sautent vers le bas, je tiens à souligner que justinko a fourni une réponse tout à fait satisfaisante à cette question ci-dessus.

Vous pouvez exécuter un seul exemple dans un groupe partagé via rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

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