0

Das Problem ... Der Versuch, einen Test zu erstellen, die optimistische Sperren zeigt, dass das Speichern verhindert aber die Aktion des Sparens tatsächlich erhöht den ActiveRecord::StaleObjectError: Attempted to update a stale object: Invoice Fehler, den Test zu sprengen. Wie kann ich die letzte Zeile des Tests ändern, um dies korrekt auszudrücken?optimistische Sperren Einheit Test 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 

Ich habe versucht ...

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

Aber ich bin immer Syntaxfehler.

assert_not second.save Keine Chance, auszulösen, wie die Tests Fehler aus, bevor es tatsächlich sagt "Ja, es hat nicht gespeichert."

Antwort

2

Wenn Sie testen möchten, ob eine Methode eine Ausnahme auslöst, verwenden Sie assert_raises.

es zu verwenden, einen Block enthält die Methode übergeben Sie erwarten, um einen Fehler zu erhöhen, etwa so:

assert_raises(ExceptionClassYouExpect) { method_that_should_raise! } 

In Ihrem Fall, ich denke, das wäre:

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

ich immer Beziehen Sie sich dazu auf die Rails Guides: http://guides.rubyonrails.org/testing.html#available-assertions.

+0

Ich hatte das gerade herausgefunden und wollte die Antwort aufschreiben. Danke, dass du mich dafür geschlagen hast! – CheeseFry