テスト駆動開発っていうのに取り組む
以前Rubyでつくる検索エンジンというのを買って一通り読み終わったんだけど、サンプルのソースでなんとなく重複したような処理が多いように感じたので、勉強のためにリファクタリングしてみようかなぁーとちょっと思いつきました。
ただサンプルのソースコードにはテストが無いので、まずはテストコードから書かないといけないんだろうけど、テストファーストなやり方っていうのがどうも自分の中で理解が曖昧なので、こちらを参考にしつつTest::Unitの使い方からまずはおさらい。
上記サイトのサンプルを基本そのまま利用しつつ、モジュールの中の特定のクラスのテストってどのように書くのかちょっとわからなかったこともあり、こんな感じのテストを書きました。
#foo-test.rb require 'test/unit' require 'foo' class SuzakuTests < Test::Unit::TestCase def setup @objFoo = Suzaku::Foo.new @objBar = Suzaku::Bar.new end def test_foo assert_equal("foo", @objFoo.foo) end def test_bar assert_equal("bar", @objBar.bar) end end
Suzakuというモジュールの中にFooというクラスとBarというクラスがあってそれぞれにメソッドがあってということを意図したテストのつもりにしてみたので、テストの対象となるfoo.rbというのをこんな感じで実装してみました。
#foo.rb module Suzaku class Foo def foo "foo" end end class Bar def bar "foo" #ここはわざと間違っている end end end
でもって、以下のように実行したら、1 failuresとなったけどそれ以外の箇所は意図通りテストにパスしたのでmoduleの中にあるクラスのテストの書き方はこれでよかったみたい。
% ruby ./foo-test.rb Loaded suite ./foo-test Started F. Finished in 0.010691 seconds. 1) Failure: test_bar(SuzakuTests) [./foo-test.rb:14]: <"bar"> expected but was <"foo">. 2 tests, 2 assertions, 1 failures, 0 errors
自分の中で少しだけ成長を感じた日曜日の午後でした