Burgers and RSpec

How responsive test design

can lead to deliciousness

# app/models/burger.rb
# app/models/burger.rb
class Burger < ActiveRecord::Base
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = 
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name:
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include?
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  def gross?
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  def gross?
    condiments.include?
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  def gross?
    condiments.include? Condiment::LETTUCE
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  def gross?
    condiments.include? Condiment::LETTUCE
  end

  def plain?
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  def gross?
    condiments.include? Condiment::LETTUCE
  end

  def plain?
    condiments.empty?
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# spec/models/burger_spec.rb
# spec/models/burger_spec.rb
describe Burger do
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    it 'passes for burgers with pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
    end
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger =
    end
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger
    end
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
    end
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger =
    end
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger
    end
    it 'passes for burgers with pickles'
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
    end
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect
    end
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?)
    end
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles'
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles' do
    end
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles' do
      expect(@yucky_burger.is_delicious?)
    end
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles' do
      expect(@yucky_burger.is_delicious?).to eql false
    end
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles' do
      expect(@yucky_burger.is_delicious?).to eql false
    end
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles' do
      expect(@yucky_burger.is_delicious?).to eql false
    end
  end

  describe 'gross?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with lettuce' do
      expect(@yucky_burger.is_gross?).to eql true
    end
    it 'fails for burgers without lettuce' do
      expect(@tasty_burger.is_gross?).to eql false
    end
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'delicious?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with pickles' do
      expect(@tasty_burger.is_delicious?).to eql true
    end
    it 'fails for burgers without pickles' do
      expect(@yucky_burger.is_delicious?).to eql false
    end
  end

  describe 'gross?' do
    before :each do
      @tasty_burger = create :burger,
                      condiments: [Condiment::PICKLE]
      @yucky_burger = create :burger,
                      condiments: [Condiment::LETTUCE]
    end
    it 'passes for burgers with lettuce' do
      expect(@yucky_burger.is_gross?).to eql true
    end
    it 'fails for burgers without lettuce' do
      expect(@tasty_burger.is_gross?).to eql false
    end
  end

  describe 'plain?' do
    before :each do
      @plain_burger = create :burger,
                      condiments: []
      @loaded_burger = create :burger,
                       condiments: [Condiment::PICKLE,
                                    Condiment::LETTUCE]
    end
    it 'passes for burgers with no condiments' do
      expect(@plain_burger.is_plain?).to eql true
    end
    it 'fails for burgers with condiments' do
      expect(@loaded_burger.is_plain?).to eql false
    end
  end
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait :with_pickles do
    condiments
  end
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait :with_pickles do
    condiments [Condiment::PICKLE]
  end
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait :with_pickles do
    condiments [Condiment::PICKLE]
  end

  trait :with_lettuce do
    condiments
  end
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait :with_pickles do
    condiments [Condiment::PICKLE]
  end

  trait :with_lettuce do
    condiments [Condiment::LETTUCE]
  end
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait :with_pickles do
    condiments [Condiment::PICKLE]
  end

  trait :with_lettuce do
    condiments [Condiment::LETTUCE]
  end

  trait :with_nothing do
    condiments
  end
end
# spec/factories/burgers.rb
FactoryGirl.define do
  factory :burger

  trait :with_pickles do
    condiments [Condiment::PICKLE]
  end

  trait :with_lettuce do
    condiments [Condiment::LETTUCE]
  end

  trait :with_nothing do
    condiments []
  end
end
# spec/models/burger_spec.rb
describe Burger do
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
  end

  describe 'with lettuce' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  describe 'with lettuce' do
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  describe 'with lettuce' do
    subject { create :burger, :with_lettuce }
    it { is_expected.not_to be_delicious }
    it { is_expected.to be_gross }
    it { is_expected.not_to be_plain }
  end

  describe 'with no condiments' do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  describe 'with lettuce' do
    subject { create :burger, :with_lettuce }
    it { is_expected.not_to be_delicious }
    it { is_expected.to be_gross }
    it { is_expected.not_to be_plain }
  end

  describe 'with no condiments' do
    subject { create :burger, :with_nothing }
    it { is_expected.not_to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.to be_plain }
  end
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  #...

  
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  #...

  def self.delicious
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  #...

  def self.delicious
    Condiment::PICKLE
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# app/models/burger.rb
class Burger < ActiveRecord::Base
  has_and_belongs_to_many :condiments

  def delicious?
    condiments.include? Condiment::PICKLE
  end

  #...

  def self.delicious
    Condiment::PICKLE.burgers
  end
end

# app/models/condiment.rb
class Condiment < ActiveRecord::Base
  has_and_belongs_to_many :burgers

  PICKLE = find_or_create_by name: 'pickle'
  LETTUCE = find_or_create_by name: 'lettuce'
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...


end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include (create :burger, :with_pickles) }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  let

  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include (create :burger, :with_pickles) }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  let(:burger_with_pickles)

  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include (create :burger, :with_pickles) }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  let(:burger_with_pickles){ create :burger, :with_pickles }

  describe 'with pickles' do
    subject { create :burger, :with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include (create :burger, :with_pickles) }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  let(:burger_with_pickles){ create :burger, :with_pickles }

  describe 'with pickles' do
    subject { burger_with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include (create :burger, :with_pickles) }
  end
end
# spec/models/burger_spec.rb
describe Burger do
  let(:burger_with_pickles){ create :burger, :with_pickles }

  describe 'with pickles' do
    subject { burger_with_pickles }
    it { is_expected.to be_delicious }
    it { is_expected.not_to be_gross }
    it { is_expected.not_to be_plain }
  end

  # ...

  describe Burger.delicious do
    it { is_expected.to include burger_with_pickles }
  end
end

Burgers and RSpec

By David Faulkenberry

Burgers and RSpec

UMass Transit IT code review, December 16th, 2015

  • 797