Antworten:
Das context
ist ein Alias für describe
, daher sind sie funktional gleichwertig. Sie können sie austauschbar verwenden. Der einzige Unterschied besteht darin, wie Ihre Spezifikationsdatei gelesen wird. Es gibt zum Beispiel keinen Unterschied in der Testausgabe. Das RSpec-Buch sagt:
"Wir neigen dazu,
describe()
für Dinge undcontext()
für den Kontext zu verwenden".
Persönlich benutze ich gerne describe
, aber ich kann sehen, warum die Leute es vorziehen context
.
feature
und scenario
sind ein Teil von Capybara und nicht von RSpec und sollen für Abnahmetests verwendet werden. feature
ist äquivalent zu describe
/ context
und scenario
äquivalent zu it
/ example
.
Wenn Sie Abnahmetests mit Capybara schreiben, verwenden Sie die Syntax feature
/ scenario
, wenn nicht die Syntax describe
/ it
.
Als ich heute Morgen einige Spezifikationen schrieb, hatte ich die gleiche Frage. Normalerweise benutze ich das hauptsächlich describe
und denke nicht besonders darüber nach, aber heute Morgen habe ich mich mit vielen Fällen und unterschiedlichen Spezifikationen für ein Modul befasst, sodass es für den nächsten Entwickler, der diese Spezifikationen lesen wird, leicht verständlich sein musste. Also habe ich Google danach gefragt und Folgendes gefunden: beschreiben vs. Kontext in rspec , dessen Antwort ich ziemlich interessant finde:
Laut dem rspec-Quellcode ist „Kontext“ nur eine Alias-Methode für „Beschreiben“, was bedeutet, dass zwischen diesen beiden Methoden kein funktionaler Unterschied besteht. Es gibt jedoch einen kontextbezogenen Unterschied, der dazu beiträgt, Ihre Tests verständlicher zu machen, indem Sie beide verwenden.
Der Zweck von "beschreiben" besteht darin, eine Reihe von Tests gegen eine Funktionalität zu verpacken, während "Kontext" darin besteht, eine Reihe von Tests gegen eine Funktionalität unter demselben Status zu verpacken.
Wenn Sie sich also auf dieses Prinzip verlassen, würden Sie eine Spezifikation wie diese schreiben:
#
# The feature/behaviour I'm currently testing
#
describe "item ordering" do
# 1st state of the feature/behaviour I'm testing
context "without a order param" do
...
end
# 2nd state of the feature/behaviour I'm testing
context "with a given order column" do
..
end
# Last state of the feature/behaviour I'm testing
context "with a given order column + reverse" do
..
end
end
Ich bin mir nicht sicher, ob dies eine allgemein akzeptierte Regel ist, aber ich finde diesen Ansatz klar und leicht zu verstehen.
Erweiterung der ausgezeichneten Antwort von Pierre laut den Dokumenten :
Die Funktion und das Szenario DSL entsprechen der Beschreibung bzw. der Beschreibung. Diese Methoden sind einfach Aliase, mit denen Feature-Spezifikationen als Kunden- und Abnahmetests mehr gelesen werden können.
Für diejenigen, die mit den Mocha-Begriffen vertraut sind und diese beschreiben (die besser geeignet sind, das Verhalten eines Tests aus der Sicht eines Benutzers zu beschreiben, daher fungiert Mocha hauptsächlich als Front-End-Test-Framework), könnten Sie:
describe
und it
oder eine andere Paarungit
innerhalb eines context
Blocks, für den mehrere Zusicherungen / Tests in einem bestimmten App-Status erforderlich sindWenn Sie sich für die zweite Option entscheiden, können Sie weiterhin der Absicht folgen, "... eine Reihe von Tests für eine Funktionalität unter demselben Status zu pingen".
So könnten Ihre Tests folgendermaßen aussehen:
#
# The feature/behaviour I'm currently testing
#
describe "item ordering" do
# 1st state of the feature/behaviour I'm testing
context "without an order param" do
# 1st and only test we want to run in this state
it "asks the user for missing order param" do
...
end
end
# 2nd state of the feature/behaviour I'm testing
context "with an invalid order param" do
# 1st test we want to run in this state
it "validates and rejects order param" do
...
end
# 2nd test we want to run in this state
it "returns an error to user" do
...
end
end
# 3rd state of the feature/behaviour I'm testing with multiple tests
context "with a valid order param" do
it "validates and accepts order param" do
...
end
it "displays correct price for order" do
...
end
unless being_audited
it "secretly charges higher price to user" do
...
end
end
end
end
Auf diese Weise überspringen Sie das feature
Schlüsselwort vollständig, das Sie möglicherweise für bestimmte Front-End-Funktionen verwenden möchten, oder wenn Sie FDD (Feature Driven Development) ausführen, was für einige möglicherweise unangenehm ist. Fragen Sie hier Ihr Entwicklerteam nach Eingaben.
Vorsichtsmaßnahme: Befolgen Sie nicht immer die Industriestandards. Stellen Sie sich vor, wir hätten alle unsere Tests nach der Volkswagen-Philosophie modelliert.