1

テスト付きのrspecコントローラーがあります:

it "assigns all rate_card_details as @rate_card_details" do
  rate_card_detail = FactoryGirl.create(:rate_card_detail)
  get :index, {}, valid_session
  assigns(:rate_card_details).should eq([rate_card_detail])
end

ほとんどのモデルでは、これで問題なく動作します。ただし、この場合、rateフィールドは 10 進数です。これにより、(何らかの理由で) rspec の比較で、メモリ内の場所を含め、BigDecimal の 1 つのインスタンスが別のインスタンスと比較されます。エラーは次のとおりです。

 Failure/Error: assigns(:rate_card_details).should eq([rate_card_detail])

   expected: [#<RateCardDetail rate_card_id: 1, item_id: 1, rate: #<BigDecimal:7f82dcdb0ae0,'0.6941E2',18(18)>, created_at: "2013-06-05 18:12:53", updated_at: "2013-06-05 18:12:53">]
        got: [#<RateCardDetail rate_card_id: 1, item_id: 1, rate: #<BigDecimal:7f82dc9a74d0,'0.6941E2',18(18)>, created_at: "2013-06-05 18:12:53", updated_at: "2013-06-05 18:12:53">]

2 つの BigDecimals は同じ値を持ちますが、異なるオブジェクトです。比較を行うときにこれらを同等に扱うようにrspecを取得する方法はありますか?

4

1 に答える 1

0

それはきれいではありませんが、これは私と一緒に動作します

it "assigns all rate_card_details as @rate_card_details" do
  rate_card_detail = FactoryGirl.create(:rate_card_detail)
  get :index, {}, valid_session
  assigns(:rate_card_details).first.attributes.values.each_with_index do |rcd,i|
    r_c_d = rate_card_detail[i]
    if rcd.is_a?BigDecimal
      rcd = rcd.to_s
      r_c_d = r_c_d.to_s
    end
    expect(rcd).to eq(r_c_d)
  end
end
于 2015-06-01T17:30:23.390 に答える