Replace Temp with Chain(一時変数からチェインへ)

テストコードがすっきりしました。
before:add_option(arg)
→after:and(arg)

before

# product code(ruby)
class Select
  def options
    @options ||= []
  end

  def add_option(arg)
    options << arg
  end
end

# test code(rspec)
describe Select do
  let(:select){ Select.new }

  describe 'add_option(arg)' do
    before do
      select.add_option(1999)
      select.add_option(2000)
      select.add_option(2001)
      select.add_option(2002)
    end

    it{ select.options.should == [1999, 2000, 2001, 2002] }
  end
end

after

# product code(ruby)
class Select
  def self.with_option(option)
    select = self.new
    select.options << option
    select
  end

  def options
    @options ||= []
  end
 
  def and(arg)
    options << arg
    self
  end
end

# test code(rspec)
describe Select do
  describe 'self.with_option(option)' do
    let(:option){ 1999 }
    subject{ Select.with_option(option) }

    it{ subject.options.should == [option] }
  end

  describe 'and(arg)' do
    let(:select_with_option){ Select.with_option(1999) }
    subject{ select_with_option.and(2000).and(2001).and(2002) }

    it{ subject.options.should == [1999, 2000, 2001, 2002] }
  end
end

※ 参考資料
 リファクタリング:Rubyエディション6.5 一時変数からチェインへ(p.140〜143)