webentwicklung-frage-antwort-db.com.de

rspec Shared-Beispiele vs. Shared-Kontext

Was ist der wirkliche Unterschied zwischen shared_examples und shared_context?

Meine Beobachtungen:

  1. Ich kann die gleichen Dinge mit beiden testen (d. H. Mit shared_examples oder shared_context)

  2. 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:

  • shared_context, um einen Block zu definieren, der im Kontext von Beispielgruppen durch implizit übereinstimmende Metadaten ausgewertet wird

Beispiel:

shared_context "shared stuff", :a => :b do
  ...
end
  • Die Art und Weise, wie diese eingeschlossen oder aus einer Testdatei aufgerufen werden

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'
30
swapab

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"
41
rafroehlich2

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
16
Jon

Sehr trivial und kosmetisch, aber include_context gibt in --format documentation nicht "verhält sich" aus.

4
hiroshi

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

0
aenw