Ответ 1
Для меня ожидания связаны с конструированием разговоров между сотрудниками. Итак, вы должны решить - есть #pick_seed
внутренняя деталь реализации или часть интерфейса совместной работы?
Если pick_seed
является деталью реализации, ожиданием является неправильный инструмент для задания. И, поскольку у вас есть аксессор для семени, вы можете действовать таким образом (обратите внимание на пример с одним утверждением):
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