Hier ist ein Beispiel für einen Backtrace, der durch die Ausführung einer gesamten Spezifikationssuite erhalten wurde, die gemeinsame Spezifikationsgruppen verwendet
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
Hier gibt es einige Probleme.
1) Angesichts der Rückverfolgung habe ich keine Ahnung, was der Kontext der freigegebenen Spezifikation ist. Aka, wo war es enthalten, in welcher Datei war es enthalten, etc... Es gibt die Beschreibung 'Arel Join#each iterates over the rows in any order', aber in einem Projekt mit vielen Spezifikationen ist das im Grunde nutzlos mich.
2) Ich hätte gerne eine Möglichkeit, diese einzelne Spezifikation isoliert in dem Kontext auszuführen, der zum Versagen geführt hat. Ich bin mir gerade nicht sicher, wie das geht.
David, ich denke, ich habe vielleicht eine Lösung dafür:
Wenn "it_should_behave_like" (oder der Alias) aufgerufen wird, werden die folgenden Metadaten auf die ExampleGroup gesetzt:
Name der freigegebenen Beispielgruppe.
Dateipfad und Zeilennummer des Methodenaufrufs "it_should_behave_like".
Wenn ein Beispiel fehlschlägt, überprüft RSpec, ob dieses Beispiel in der freigegebenen Beispielgruppe vorhanden ist. Wenn dies der Fall ist, werden der Dateipfad und die Zeilennummer (die in den ExampleGroup-Metadaten gespeichert sind) an die Ausgabe angehängt.
Was denkst du?
Oh schön, ich sehe, dass Metadaten schon da sind :-)
Ich habe den Patch von @justinko (3906559d059bcdbd4d15303303c517088b038eeb) zusammengeführt, der die Zeile anzeigt, die die gemeinsam genutzte Gruppe aufruft, sodass wir jetzt den Kontext kennen, in dem sie ausgeführt wurde. Das lässt immer noch das Problem der Ausführung eines einzelnen freigegebenen Beispiels offen – aber dies sollte zumindest helfen zu verstehen, wenn ein freigegebenes Beispiel fehlschlägt.
Sie können ein einzelnes Beispiel in einer freigegebenen Gruppe über rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"
ausführen
Ja - das stimmt. Das ist gut genug für mich. Ich werde das schließen. @carllerche wenn Sie denken, dass dies nicht ausreicht, kommentieren Sie hier und ich werde das wieder öffnen.
Mist, habe hier einen Fehler gefunden:
share_as :MySpecs do
let(:foo) { described_class # returns nil }
Untersuchen.
Ich möchte share_as verwerfen. Es generiert ein Modul, das Sie dann mit include
einbinden, was ganz andere Auswirkungen hat als das Erstellen einer verschachtelten Gruppe, wie wir es jetzt mit shared_examples_for
tun. WDYT?
Ich stimme der Ablehnung voll und ganz zu. Als ich anfing, RSpec zu lernen, war ich verwirrt, warum es shared_examples_for
und share_as
.
Ich neige dazu, share_as
für die Top-Level-Gruppe zu verwenden:
describe Model do
include MySharedSpecs
context 'it works' do
it_should_behave_like 'a working model'
Ich wechselte zu shared_examples_for
und alles ist gut. Danke.
Für alle, die nach unten springen, möchte ich darauf hinweisen, dass Justinko oben eine völlig zufriedenstellende Antwort darauf gegeben hat.
Sie können ein einzelnes Beispiel in einer freigegebenen Gruppe über rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world" ausführen.
Hilfreichster Kommentar
Sie können ein einzelnes Beispiel in einer freigegebenen Gruppe über
rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"
ausführen