Я только вхожу в RSpec и немного поэкспериментирую с некоторыми простыми примерами и реализую древовидную структуру узлов с посещаемыми узлами.
Первый тест, который я использовал для очистки кода с помощью bdd, был:
describe "Tree" do
it "is visitable" do
t = Tree.new
visited = nil
t.visit { |n| visited = n }
visited.should == t
end
end
Это дает мне следующую реализацию:
class Tree
def visit(&block)
block.call self
end
end
Я не очень доволен кодом RSpec на данный момент, так как он не очень ясно показывает намерение того, что я пытаюсь сделать, даже если он работает технически. Когда я перехожу к реализации детей, становится еще сложнее:
it "has visitable children" do
c1, c2 = Tree.new, Tree.new
t = Tree.new([c1, c2])
visited = Set.new
t.visit { |n| visited.add(n) }
visited.should == Set.new([t, c1, c2])
end
Это дает мне полную реализацию:
class Tree
attr_accessor :children
def initialize(children=[])
@children = children
end
def visit(&block)
block.call self
children.each { |c| c.visit &block }
end
end
Я достаточно доволен итоговой реализацией (будучи пробным примером и всем прочим), но есть ли идиома RSpec, которая может сделать спецификацию более преднамеренной и легко читаемой?
Редактировать: Чтобы уточнить, мне интересно, есть ли хорошие способы справиться с этим с помощью помощников / насмешек RSpec и т. Д.