交易中的Rspec测试方法

时间:2016-01-15 03:43:34

标签: ruby-on-rails activerecord rspec

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

1 个答案:

答案 0 :(得分:2)

如果引发异常,则仅回滚ActiveRecord事务。否则他们会坚持成功创建任何记录。

在您的情况下,您希望使用save!而不是save来中断交易。这将引发您需要救援和处理的ActiveRecord::RecordInvalid例外。

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