spec(rspec)を使ってテストしているんだが、誤差を含んだ小数のテストの仕方が分からなかった。
「rspec 小数」でググると、spec を書くときに float の誤差を無視したりしなかったりがヒットするのだが、実はここに書かれている方法ではテストは通らない(rspec 1.1.11にて確認)
途中でrspecの仕様が変ったようだ。小一時間悩んで、いろいろググって、ようやく小数のテストの方法が分かった。
ちなみ小数のテストは以下のような書き方でよい。
context "循環小数 (1 / 3.0) のspecを書く場合" do specify "0.33 に近く、誤差は 0.004 以下であること" do ( 1 / 3.0 ).should be_close(0.33, 0.004) end end context "浮動小数点の誤差を含む計算への spec を書く場合、0.1を10回足しあわせた値は" do setup do @ret = 0.0 10.times { @ret += 0.1 } end specify "1.0に近く、誤差は0.1以下であること" do @ret.should be_close(1.0, 0.1) end specify "1.0と*同じ*ではないこと" do @ret.should_not eql(1.0) end end
このような be_close()とかeql()などはrspecではMatcher(マッチャ)と呼ばれている。 ほかにどのようなMatcherがあるかは、 RSpecの標準Matcher一覧表を参照にすべし。