Was ist der wirkliche Unterschied zwischen shared_examples
und shared_context
?
Meine Beobachtungen:
Ich kann die gleichen Dinge mit beiden testen (d. H. Mit shared_examples
oder shared_context
)
Einige meiner anderen Tests schlagen jedoch fehl, wenn ich später einen Test verwende.
Beobachtung # 1:
Ich habe shared_examples und shared_context per Dokumentation auf https://www.relishapp.com/ verglichen.
Syntaktische Unterschiede sind:
Beispiel:
shared_context "shared stuff", :a => :b do
...
end
shared_examples
include_examples "name" # include the examples in the current context
it_behaves_like "name" # include the examples in a nested context
it_should_behave_like "name" # include the examples in a nested context
shared_context
include_context "shared stuff"
Beobachtung # 2
Ich habe einen Testfall
shared_context 'limit_articles' do |factory_name|
before do
@account = create(:account)
end
it 'should restrict 3rd article' do
create_list(factory_name, 3, account: @account)
article4 = build(factory_name, account: @account)
article4.should be_invalid
end
it 'should allow 1st article' do
...
end
it 'should allow 2nd article' do
...
end
end
Fügen Sie den Kontext in eine Spezifikationsdatei ein, in der bereits ein shared_context enthalten ist. Dann schlägt der vorhandene fehl. Aber ich ändere die Reihenfolge und alle meine Tests bestehen
Schlägt fehl
include_context 'existing_shared_context'
include_context 'limit_articles'
Auch wenn ich den shared_context
durch shared_examples
ersetze und dementsprechend in den Testfall einfügen.
Geht vorbei
include_context 'existing_shared_context'
it_behaves_like 'limit_articles'
shared_examples
sind Tests, die so geschrieben sind, dass Sie sie in mehreren Einstellungen ausführen können. gemeinsames Verhalten zwischen Objekten extrahieren.
it_behaves_like "a correct object remover" do
...
end
shared_contexts
ist ein beliebiger Setup-Code, mit dem Sie einen Testfall vorbereiten können. Auf diese Weise können Sie Testhilfemethoden einschließen oder die Ausführung der Tests vorbereiten.
include_context "has many users to begin with"
shared_examples
enthält eine Sammlung von Beispielen, die Sie in andere Beschreibungsblöcke aufnehmen können.
Ein shared_context
enthält eine Sammlung von gemeinsamem Code, den Sie in Ihre Testdatei aufnehmen können. Stellen Sie sich dies wie ein Ruby-Modul vor.
Sie verwenden einen shared_context
in Ihrem Testcode, indem Sie ihn der include_context
-Methode hinzufügen.
Andererseits geben Sie an, dass eine bestimmte Sache behaves_like
eine gemeinsam genutzte Beispielgruppe ist.
Ich denke, es ist eine Frage der Lesbarkeit.
AKTUALISIEREN:
Wenn Sie sich den Quellcode anschauen, werden Sie feststellen, dass sie genau das Gleiche sind. Check out Zeile 35 in dieser Datei:
https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/shared_example_group.rb
alias_method :shared_context, :shared_examples
Sehr trivial und kosmetisch, aber include_context
gibt in --format documentation
nicht "verhält sich" aus.
Hier ein großartiger Beitrag von Rudy Jahchan, der nicht nur zeigt, wie shared_context
und shared_example
verwendet werden, sondern auch , warum sie wertvoll sind.
Dies geschieht, indem Sie eine Spezifikation übernehmen und diese dann umgestalten (DRY), um shared_example
und shared_context
zu verwenden.
BDD-Zusammensetzung über Vererbung mit RSpec Shared-Beispielen