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.
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"
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"