Rspec-core: Es sollte eine Möglichkeit geben, einzelne Spezifikationen in einer gemeinsamen Gruppe isoliert auszuführen

Erstellt am 20. Juli 2010  ·  10Kommentare  ·  Quelle: rspec/rspec-core

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.

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

Alle 10 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen