次のような単純なクラスがあるとします。
class Box
def initialize
@widgets = []
end
def add_widget(widget)
@widgets << widget
end
def widgets
@widgets
end
end
次のようなテストを作成します。
describe Box do
describe "#initialize" do
it "creates an empty box"
Box.new.widgets.should == []
end
end
describe "#add_widget" do
it "adds a widget to the box"
widget = stub('widget')
box = Box.new
box.add_widget(widget)
box.widgets.should == [widget]
end
end
describe "#widgets" do
it "returns the list of widgets"
widget = stub('widget')
box = Box.new
box.add_widget(widget)
box.widgets.should == [widget]
end
end
end
最後の2つのテストがどのように同一になるかに注意してください。私はこれらの重複するケースを回避する方法に苦労しています。最初の2つのケースでは暗黙的に#widgetsをテストしていますが、明示的なテストも必要だと感じています。ただし、このためのコードは2番目のケースと同じになります。
クラスに3つのパブリックメソッドがある場合、それらの各メソッドに対応する少なくとも1つのテストが必要です。私が間違っている?
アップデート
単純なアクセサーをテストしないようにアドバイスするRonJeffriesによるこの記事を見つけました。