Минитест оптимистического блокирующего устройства

Проблема... Попытка создать тест, демонстрирующий, что оптимистическая блокировка препятствует сохранению, НО действие по сохранению фактически вызывает ошибку ActiveRecord::StaleObjectError: Attempted to update a stale object: Invoice, что приводит к сбою теста. Как я могу изменить последнюю строку теста, чтобы правильно выразить это?

  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 Не срабатывает, так как тесты выдают ошибки до того, как на самом деле говорят "да, это не сохранено".


person CheeseFry    schedule 03.05.2016    source источник


Ответы (1)


Если вы хотите проверить, вызывает ли метод исключение, используйте assert_raises.

Чтобы использовать его, передайте блок, содержащий метод, который, как вы ожидаете, вызовет ошибку, например:

assert_raises(ExceptionClassYouExpect) { method_that_should_raise! }

В вашем случае, я думаю, это будет:

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

Я всегда обращаюсь к руководствам по Rails: http://guides.rubyonrails.org/testing.html#available-assertions.

person Matt    schedule 03.05.2016
comment
Я только что понял это и собирался написать ответ. Спасибо, что опередили меня! - person CheeseFry; 04.05.2016