Как отловить ошибку ActiveRecord :: RecordInvalid в rails / rspec - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу поймать ошибку ActiveRecord на Rspe c: (я также использую фабрику)

Rspe c

it "should throw an error" do
    animal = create(:animal)
    food_store = -1;
    expect(animal.update!(food_store: food_store)).to raise_error(ActiveRecord::RecordInvalid)

Валидатор:

class AnimalValidator < ActiveModel::Validator
  def validate(record)
    if record.food_store < 1
      record.errors[:food_store] << "store can't be negative"
    end
  end
end

Я получаю это сообщение об ошибке:

 Failure/Error: expect(animal.update!(food_store: new_share)).raise_error(ActiveRecord::RecordInvalid)

 ActiveRecord::RecordInvalid:
   Validation failed: store can't be negative

Как мне перехватить эту ошибку activeRecord?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

С raise_error необходимо expect блок. Без блока он выполнит код animal.update! и попытается передать возвращаемое значение вызова этого метода методу expect в качестве параметра, но это невозможно, поскольку в нем уже есть ошибки. С блоком он откладывает выполнение блока до тех пор, пока expect не скажет ему выполнить (т. Е. С yield или аналогичным) и не даст RSpe c шанс перехватить исключение.

Так , используйте:

expect { animal.update!(food_store: food_store) }.to raise_error(ActiveRecord::RecordInvalid)

вместо

0 голосов
/ 20 февраля 2020

Итак, я нашел потенциальное решение, используя скобки вместо скобок

    expect {animal.update!(food_store: food_store)}.to raise_error

Публикация здесь не для, но я не уверен, что это лучшее решение

...