rspec bietet mehrere Varianten an um tests auszudrücken.
die meist verenwende Form ist.
it "value is 5" do
value.should eq(5)
end
# expect-Variante
it "value is 5" do
expect(value).to eq(5)
end
oder kurz:
it { value.should eq(5) }
# expect-Variante
it { expect(value).to eq(5) }
Aber es gitb auch andere Formen wie
it { should validate_presence_of(:name) }
# hier gitb es leider keine expect variante
Doch worauf bezieht sich das should ? Es bezieht sich auf subject.
it { subject.should validate_presence_of(:name) }
# expect-Variante
it { expect(subject) validate_presence_of(:name) }
Und was subject ist hängt von der definit von subject ab.
subject { Person.new(name: "Luke") }
it { subject.name.should eq("Luke") }
Wenn subject nicht angegbeen ist, so wir ein subject automaitsch erstellt
describe User do
# Hier ist subject automatisch User.new
end
Mit der Form its kann man auf attribute des Subjects testen:
its(:name) { should eq("luke") }
# keine expect-Variante
ist eine Abkürzung für
it { subject.name.should eq("Luke")
# expect-Variante
it { expect(subject.name).to eq("Luke") }
Mit let(:user) { ... }
wird der Block erst dann ausgeführt, wenn user verwendet wird. Mit let!(:user)
wird immer der Block ausgeführt. Da dieses kleine Detail die Testausführung beeinflußt emfehle ich nicht die Verwendung von let!
.
Vielmehr sollte im before-Block oder direkt im it-Block User aufgerufen werden, um unklahrheiten zu vermeiden.
Mein Vorschlag ist es nur die Hauptform zu verwenden und auf its, let! und subject generell zu verzichten. Somit haben wir eine einheitliche Schreibweise und können vollständig auf die expect-Syntax wechseln. Auf subject sollte generell verzichtet werden, da diese auch ohne explizite Angabe von subject von rspec generiert wird und zu unklarheiten führen kann. Tests sollten einfach gehalten werden.
Also statt
describe User do
subject { User.new(name: "luke") }
it { should validate_presence_of(:name) }
its(:name) { should eq("luke") }
end
nur noch
describe User do
let(:user) { User.new(name: "luke") }
it { expect(user).to validate_presence_of(:name) }
it { expect(user.name).to eq("Luke") }
end
Übrignes. Thoughtbot geht noch einen schritt weiter und verwenden, weder let
noch before
. Siehe https://github.com/thoughtbot/guides/tree/master/style.