Skip to content

Instantly share code, notes, and snippets.

@HusseinMorsy
Last active December 17, 2015 23:59
Show Gist options
  • Save HusseinMorsy/5693641 to your computer and use it in GitHub Desktop.
Save HusseinMorsy/5693641 to your computer and use it in GitHub Desktop.

Rspec Styleguide Vorschlag

rspec bietet mehrere Varianten an um tests auszudrücken.

Hauptform

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) }

Implizietes subject

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

its-Form

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") }

let!

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.

Conclusion

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment