Skip to content

Latest commit

 

History

History
35 lines (28 loc) · 1.08 KB

use-tap-for-better-test-data-setup.md

File metadata and controls

35 lines (28 loc) · 1.08 KB

Use Tap For Better Test Data Setup

I often use RSpec's let statement to set up some test data.

let(:order) { create(:order, name: "My Order") }

Often times, realistic test data requires setting up peripheral data as well.

let(:order) do
  order = create(:order, name: "My Order")
  create(:item, name: "Burger", order: order, price: 4.99)
  create(:item, name: "Fries", order: order, price: 2.99)
  order
end

This can get hard to read as the subject of the let gets obscured. It is also clumsy that we have to end with returning the order. This can be cleaned up with the use of #tap.

let(:order) do
  create(:order, name: "My Order").tap do |order|
    create(:item, name: "Burger", order: order, price: 4.99)
    create(:item, name: "Fries", order: order, price: 2.99)
  end
end

The block notation and indentation make it clear that the order is what is getting created. Meanwhile, the interior of the block gives us a designated area to do what we need to with the newly-created order instance.