繁体   English   中英

事务中的 Rspec 测试方法

[英]Rspec testing methods in transaction

我试图在一个事务中执行两件事,但我不确定我应该如何在 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) 添加到事务中,它就可以工作。 我认为它是用于嵌套事务的,而不是这样的。 我错过了什么吗?

ActiveRecord 事务仅在引发异常时回滚。 否则,它们会保留已成功创建的任何记录。

在您的情况下,您想使用save! 而不是save以中断交易。 这将引发您需要挽救和处理的ActiveRecord::RecordInvalid异常。

begin
  ActiveRecord::Base.transaction do
    ...some implementation...
    model1.save!
    model2.save!
  end
rescue ActiveRecord::RecordInvalid
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM