gpt4 book ai didi

ruby-on-rails - 使用 rspec 测试 before_destroy 方法

转载 作者:行者123 更新时间:2023-12-04 16:44:06 25 4
gpt4 key购买 nike

嗨,我在如何测试这种情况下遇到了麻烦

模型/ list .rb

before_destroy :destroyable?

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

规范/型号/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

我收到此错误: 运行时错误:
错误

最佳答案

异常(exception)应该用于特殊情况,您的情况并不异常(exception)。对于 rails 4 你应该返回 false 而对于 rails 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'

检查回调文档,“取消回调”部分 https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

编辑:
如果您仍然希望在记录未销毁时出现异常,则 before_destroy 回调将是相同的,但您调用 destroy!相反(注意“!”爆炸声)会引发 ActiveRecord::RecordNotDestroyed异常(exception)。

将异常引发为 destroy 是违反直觉的取消,因为它并不意味着按照惯例那样工作。

关于ruby-on-rails - 使用 rspec 测试 before_destroy 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com