2012-05-09 5 views
1

私は現在、請求書を持っている仕事のためのイントラネットを構築しています。私は現在、VATが正しく合計されているかどうかを確認するためのテストを書いています。私のRailsアプリケーションの価格が高すぎます

Rails/Rubyはもっと正確である必要があると私は気づきました。私はこれを得る:expected there to be content "2586.6099999999997"。それが1であるべきとき099999999997に注目してください。私は2586.61ない2586.60999...を合計しなければならない二つの値、9491637.61を追加しようとしています私のテストでt.decimal :price, :precision => 8, :scale => 2

- 私のDB移行ファイルで

私はこれを持っています。

どのような問題がありますか?

10進数を使用すべきか、整数を使うべきですか?

EDIT:仕様コードは、基本的にはちょうどこのpage.should have_content(item1.price + 1637.61)です。 item1はFactoryGirlを使用しています。手動でデータベースの列が実際にはそれが必要のように機能しているようですね。このpage.should have_content(949 + 1637.61)

item1 = FactoryGirl.create(:item, :quantity => 1, :price => 949.00, :description => "macbook for 949") 
+2

、floatを使用しないでください。金額をセントラルフィールドまたは小数点の型としてセント/ペニーとして格納します。 –

+0

スペックコードを掲載できますか? –

+0

質問で問題が発生しているスペックコードを追加する –

答えて

3

のようなテストで949または949.00を入れたときに、それはdecimal列なので

私は、同じ問題を取得します。問題は、あなたのスペックのコードである:価格は949.00である

page.should have_content(item1.price + 1637.61) 

もしそうなら、それは949.00 + 1637.61をやっています。これはデータベース列とは独立していることを覚えておいてください。ルビコードだけです。したがって949.00 + 1637.61は、浮動小数点(1637.61)を10進数値(949.00)に追加すると評価されています。これはfloatを返します。したがって、2586.60999です。したがって、仕様は2586.60999と予想されていますが、ビューには2586.61が表示されています(小数点以下の桁である必要があります)。

あなただけの簡単な修正されるかもしれないこと、あなたのスペックに文字列や固定値を使用することができた場合:

:また

page.should have_content("2586.61") 

、あなたは、10進形式でのようなものをすべてを保っていることを確認してくださいすることができます金額については

page.should have_content(item1.price + BigDecimal.new("1637.61")) 
+0

ありがとう、ありがとう。私は 'number_to_currency'を使用していますので、' 2,586.61'を期待しているように999.99以上の値にカンマ '、'を入れますが、テストでは '2586.61'を探して失敗します。 –

+0

この場合、文字列メソッドと "2,586.61"のハードコードだけを使用するか、スペックファイルで 'number_to_currency'ヘルパーを使用する必要があります(ビューヘルパーがデフォルトで利用可能かどうかはわかりません) –

+0

'ActionController :: Base.helpers.number_to_currency(...) 'を使って直接アクセスすることができます –

関連する問題