【发布时间】:2019-06-05 11:15:37
【问题描述】:
我想从两个错误中测试我使用rescue 的调用方法 - AASM::InvalidTransition 和 ActiveModel::ValidationError 并将其发送到 rollbar。如果状态不存在,它应该显示验证错误。
def call
all_to_expire.each do |offer|
begin
offer.expire!(actor: self)
rescue AASM::InvalidTransition, ActiveModel::ValidationError => e
Rollbar.error(e)
end
end
end
规格:
context 'when offer is invalid' do
before do
allow(BankOffers::CloseExpired).to receive(:new).and_return(invalid_expire)
allow(invalid_expire).to receive(:call).and_raise(ActiveModel::ValidationError)
end
let(:invalid_expire) { instance_double(BankOffers::CloseExpired, call: nil) }
it 'catch validation error' do
expect do
invalid_expire
end.to raise_error(ActiveModel::ValidationError)
end
end
end
编辑:
更新了所有规格 - 我想我必须使用 instance_double 并通过模拟所有服务来引发错误,但最后我得到了一个错误:
expected ActiveModel::ValidationError but nothing was raised
【问题讨论】:
-
您确定您的设置实际上应该引发您想要的异常吗?使用 byebug,在调用
.expire!之前停止call方法内的执行并检查对象,也许您没有代码引发异常所需的状态。 -
好的@arieljuod你是对的,我没有一个可以失败的例子。我的问题是如何获得一个将传递给调用方法的方法,其中包含无效字段和上升验证错误。是的,我肯定想要这个
rescue -
就我所见,我必须使用 mock (?) 来伪造实现并强制出错,但我不知道该怎么做......
标签: ruby-on-rails rspec rspec-rails