RSpec: Was ist der Unterschied zwischen einer Funktion und einer Anforderungsspezifikation?

113

Was ist der konzeptionelle Unterschied zwischen den Funktionsspezifikationen von Rspec und den Anforderungsspezifikationen ?

Aus den Funktionsspezifikationsdokumenten:

Feature-Spezifikationen sind Tests auf hoher Ebene, mit denen Funktionsbereiche über eine Anwendung ausgeführt werden sollen. Sie sollten die Anwendung nur über ihre externe Schnittstelle, normalerweise Webseiten, steuern.

Und für Anforderungsspezifikationen:

Anforderungsspezifikationen bieten einen dünnen Wrapper für die Integrationstests von Rails und sind so konzipiert, dass sie das Verhalten über den gesamten Stapel hinweg steuern, einschließlich Routing (von Rails bereitgestellt) und ohne Stubbing (das liegt bei Ihnen). Mit Anforderungsspezifikationen können Sie:

  • Geben Sie eine einzelne Anforderung an
  • Geben Sie mehrere Anforderungen auf mehreren Controllern an
  • Geben Sie mehrere Anforderungen in mehreren Sitzungen an

Ich weiß, dass Funktionsspezifikationen Capybara verwenden und Anforderungsspezifikationen nicht. Das verdient aber kaum unterschiedliche Konzepte.

Schaden
quelle

Antworten:

147

Der konzeptionelle Unterschied besteht darin, dass Sie normalerweise eine User Story testen und alle Interaktionen über die Benutzeroberfläche gesteuert werden sollten. Hier kommt Capybara ins Spiel. Eine Anforderungsspezifikation testet immer noch das Verhalten Ihrer Anwendung und hat nicht die Erwartung der Lesbarkeit, die ein Abnahmetest haben würde. Die verbesserte Syntax für Abnahmetests bietet also Funktionen.

Zu den technischen Unterschieden gehören Wrap-Rails-Integrationstests für Anforderungsspezifikationen, Feature-Spezifikationen dagegen nicht. Dies bedeutet, dass Sie mit Anforderungsspezifikationen die Methoden get, post, put, delete und assert gegen die Antwort verwenden können. Mit den Funktionsspezifikationen sollten Sie die gesamte Interaktion über den Browser steuern und Methoden wie "Besuchen" und "Bestätigen" für die Seite verwenden.

Ich würde empfehlen, die Funktion feature_spec.feature im Quellcode von rspec-rail auf github zu lesen. Ich hoffe das hilft.

Richard Jordan
quelle
2
Würden Sie also empfehlen, sowohl Funktions- als auch Anforderungsspezifikationen zu verwenden, oder ist das eine oder andere ausreichend? (Neu bei TDD ...)
Robertwbradford
2
Ich benutze beide, @robertwbradford. Ich verwende Funktionsspezifikationen, um mich in Tests nach außen zu bewegen - die Benutzererfahrung zu testen und dann die Funktionalität mithilfe von Komponententests auszubauen. Ich verwende Anforderungsspezifikationen zum Testen von Antworten - z. B. in einer session_spec habe ich möglicherweise einen Beschreibungsblock "GET /login"mit Erwartungen in itBlöcken wie expect(response.status).to eq(200)und expect(response).to render_template(:new)oder in describe "POST /sessions"einem context "with valid credentials"Block mit expect(response).to redirect_to(user)undfollow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan
5
Und verwenden Sie auch Controller-Spezifikationen? Es scheint, dass zwischen dem, was Sie in Anforderungsspezifikationen testen, und dem, was normalerweise in Controller-Spezifikationen getestet wird, eine gewisse Überschneidung besteht.
Ernesto
5
Der oben verlinkte Beitrag beschreibt die Unterschiede deutlich. Verwenden Sie Anforderungsspezifikationen zum Testen über die API und Funktionsspezifikationen zum Testen über das Frontend.
Damien Roche
2
@RichardJordan: Eine Frage: Würden Sie in Feature-Spezifikationen empfehlen, Rails-Pfade (dh visit users_path) oder fest codierte Zeichenfolgen ( visit '/users') zu verwenden?. Persönlich bevorzuge ich es, keine App-Interna in solchen Spezifikationen zu verwenden.
tokland