Build Robust & Production Quality Applications - Lesson 2: Alternative Style of Rspec
20 Feb 2015An Alternative Style of Rspec
- using let, before, subject, etc.
 
Uses lazy evaluation which means it doesn't evaluate the :todo or the subject until it has to ...namingly when it reaches it or before.
To avoid lazy evaluation, you could do:
let!(:todo) {Todo.create(name: "cook dinner")}Pros:
is more concise and separates the common set up code using lets
Cons:
For a lengthy test suite it may be hard to connect the test with the description.
Using let
Step 1. Eliminate the repetition of Todo.create in each test:
describe "#display_text" do
  let(:todo) { Todo.create(name: "cook dinner") }Step 2. Replace todo.display_ text
describe "#display_text" do
  let(:todo) { Todo.create(name: "cook dinner") }
  let(:subject) { todo.display_text }or
Step3. Replace todo.display_text
describe "#display_text" do
  let(:todo) { Todo.create(name: "cook dinner") }
  subject { todo.display_text }Using before for case specific tests
context "displays the name when there's no tags" do
  it "displays the name when there's no tags" do
    subject.should == "cook dinner"
  end
end
context "displays the only tag with word 'tags' when there's one tag"
  before do
    todo.tags.create(name: "home")
    todo.tags.create(name: "urgent")
  end
  it "displays name with multiple tags" do
    subject.should == "cook dinner (tags: home, urgent)"
  end
endChange lengthy context to more succinct:
context "displays the only tag with word 'tags' when there's one tag"to =>
context "multiple tags"Remove the "it -text-" because its in context with the description
context "one tag" do
  before { todo.tags.create(name: "home") }
  it { should == "cook dinner (tag: home)" }
end