19

#initializeRSpecで動作を指定するにはどうすればよいですか?たとえば、ここで:

generator.rb

class Generator
  attr_accessor :seed

  def initialize(seed = nil)
    @seed = seed || pick_seed
  end

  def pick_seed
    Time.now.to_i
  end
end

generator_spec.rb

require 'generator'

describe Generator

  it "calls 'pick_seed' method unless seed specified" do
  end

end

pick_seedメソッドから呼び出されるメソッドに期待を設定したいと思い#initializeます。

4

1 に答える 1

24

私にとって、期待は共同作業者間の会話を設計することです。したがって、決定する必要があります-#pick_seed内部実装の詳細ですか、それともコラボレーションロールのインターフェイスの一部ですか?

が実装の詳細である場合pick_seed、期待はその仕事にとって間違ったツールです。そして、シード用のアクセサーがあるので、次のように進めることができます(例ごとに1つのアサーションに注意してください)。

class Generator
  attr_accessor :seed

  def initialize(seed = nil)
    @seed = seed || pick_seed
  end

  def pick_seed
    Time.now.to_i
  end
end

describe Generator do
  context "creating" do 
    context "when a seed is specified" do
      it "uses that seed" do
        seed = 123
        generator = Generator.new(seed)
        generator.seed.should == seed
      end
    end
    context "when a seed is not specified" do
      it "creates its own seed" do
        generator = Generator.new
        generator.seed.should_not be_nil
      end
    end
  end
end

OTOH、シードの選択が「シードピッカー」の役割の一部である場合、モックはシードピッカーの設計に役立ち、依存性注入は役割を割り当てる標準的な方法です。次のように書くことができます:

class GeneratorWithCollaborator
  attr_accessor :seed

  def initialize(seed = nil, seed_picker = self)
    @seed = seed || seed_picker.pick_seed
  end

  def pick_seed
    Time.now.to_i
  end
end

describe GeneratorWithCollaborator do
  context "creating" do
    context "when a seed is specified" do
      it "uses that seed" do
        seed = 123
        seed_picker = double('seed picker')
        seed_picker.should_not_receive(:pick_seed)
        generator = GeneratorWithCollaborator.new(seed, seed_picker)
        generator.pick_seed
      end
    end

    context "when a seed is not specified" do
      it "delegates to its seed picker" do
        seed_picker = double('seed picker')
        seed_picker.should_receive(:pick_seed)
        generator = GeneratorWithCollaborator.new(nil, seed_picker)
      end
    end
  end
end
于 2010-12-25T14:58:24.157 に答える