0

問題...楽観的ロックが保存防止するが、実際には保存のアクションがテストを爆破、ActiveRecord::StaleObjectError: Attempted to update a stale object: Invoiceエラーが発生することを実証するテストを作成しようとしてい 。これを正しく表現するには、テストの最終行をどのように変更できますか?オプティミスティック・ロックユニットテストMinitest

test "optimistic locking prevents save" do 
    merchant = create(:merchant) 
    invoice = Invoice.new(amount: 9.99, 
          currency: "USD", 
          item_count: 1, 
          invoice_id: build(:invoice).invoice_id, 
          merchant_id: merchant.merchant_id, 
          invoice_type: 'post-flight', 
          invoice_details_attributes: [ 
          { 
          description: 'Detail1', 
          item_quantity: 1, 
          item_amount: 9.99, 
          detail_total: 9.99 
          } 
          ], 
          trips_attributes: [ 
          { 
          passenger_first_name: 'Josh', 
          passenger_last_name: 'Smith', 
          depart_airport: 'MCI', 
          arrive_airport: 'SAN', 
          departure_date: 10.days.from_now, 
          passenger_count: 10 
          } 
          ]) 
    invoice.save! 
    first = Invoice.find(invoice.invoice_id) 
    second = Invoice.find(invoice.invoice_id) 
    first.currency = "GBP" 
    second.currency = "EUR" 
    first.save 
    second.save 

    assert_equal ActiveRecord::StaleObjectError, Exception 
    end 

私が試した ...

rescue Exception => e 
puts $!.to_s 
assert_equal ActiveRecord::StaleObjectError, e 
end 

しかし、私は構文エラーを取得しています。

assert_not second.save 実際に「はい、保存しませんでした」という前にテストのエラーが発生する可能性はありません。

答えて

2

メソッドが例外を発生させるかどうかをテストする場合は、assert_raisesを使用します。

そうのような、それを使用するあなたがエラーを発生させることを期待する方法を含むブロックを渡すために:あなたのケースでは

assert_raises(ExceptionClassYouExpect) { method_that_should_raise! } 

、私はこれが可能だと思う:

assert_raises(ActiveRecord::StaleObjectError) { second.save } 

私はいつもこれに関するRailsガイド:http://guides.rubyonrails.org/testing.html#available-assertionsを参照してください。

+0

私はちょうどそれを考え出し、答えを書きたいと思っていました。私にそれを打つことありがとう! – CheeseFry

関連する問題