読者です 読者をやめる 読者になる 読者になる

Happy My Life

日常とか技術とか

spec(rspec)を使ってfloatなど小数を比較

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一覧表を参照にすべし。