我正在尝试在事务中执行两件事,我不确定如何在rspec中测试它。我的代码看起来像这样:
实现:
def method
begin
ActiveRecord::Base.transaction do
...some implementation...
model1.save!
model2.save!
end
rescue => e
exception_info = {:class => e.class, :message => e.message, :backtrace => e.backtrace}
@logger.warn("Error. Rolling back.", :exception => exception_info)
end
end
试验:
it "model1 object is not created if model2 fails to save" do
Model1.any_instance.should_receive(:save).and_raise("model1 save error!!")
method
Model2.all.should == []
end
it "" do
Model2.any_instance.should_receive(:save).and_raise("model2 save error!!")
method
Model1.all.should == []
end
我想要保存模型或不保存模型。我的rspec测试检查了两个案例,但我一直在收到错误。如果我将(:requires_new => true)添加到事务中,它就可以工作。我认为它适用于嵌套事务,不是这样的。我错过了什么吗?
答案 0 :(得分:2)
如果引发异常,则仅回滚ActiveRecord事务。否则他们会坚持成功创建任何记录。
在您的情况下,您希望使用save!
而不是save
来中断交易。这将引发您需要救援和处理的ActiveRecord::RecordInvalid
例外。
begin
ActiveRecord::Base.transaction do
...some implementation...
model1.save!
model2.save!
end
rescue ActiveRecord::RecordInvalid
end