Тестирование метода before_destroy с помощью rspec - PullRequest
0 голосов
/ 18 октября 2018

Привет У меня возникла проблема с тем, как мне протестировать этот сценарий

models / checklist.rb

before_destroy :destroyable?

def destroyable?
 raise "Error" if phase.companies.count > 0
end

spec / models / checklist_spec.rb

describe 'triggers' do
 describe 'destroyable?' do
  it 'should raise error if checklist phase has companies' do
    company = create(:company)
    company2 = create(:company)
    phase = create(:phase, company_ids: [company.id, company2.id])

    checklist = create(:checklist, phase: phase)

    expect(checklist.destroy).to raise_error(RuntimeError)
  end
 end
end

Я получаю эту ошибку: RuntimeError: Ошибка

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Исключения следует использовать для исключительных ситуаций, ваша ситуация не является исключительной.Для рельсов 4 вы должны вернуть false, а для рельсов 5 вы должны вызвать throw(:abort), чтобы предотвратить уничтожение записи.

Вы можете добавить ошибку (чтобы получить некоторую обратную связь), а затем отменить, если условие истинно:

before_destroy :destroyable?

def destroyable?
  return true if phase.companies.count == 0
  errors.add(:companies, 'is not empty')
  throw(:abort)
end

Теперь вы можете проверить это следующим образом:

checklist.destroy
expect(checklist).not_to be_destroyed
expect(checklist.errors[:companies]).to eq 'is not empty'

Проверьте DOC обратных вызовов, раздел «Отмена обратных вызовов» https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

РЕДАКТИРОВАТЬ: Если вывсе еще хотите иметь исключение, когда запись не уничтожена, тогда обратный вызов before_destroy будет таким же, но вместо этого вы вызываете destroy! (обратите внимание на «!»), что вызывает исключение ActiveRecord::RecordNotDestroyed.

Противоинтуитивно выдвигать исключение как destroy отмена, так как это не должно работать по соглашению.

0 голосов
/ 18 октября 2018

Вы должны обернуть код, вызывающий ошибку в блоке,

expect { checklist.destroy }.to raise_error(RuntimeError)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...