2016-01-15 7 views
1

Я пытаюсь выполнить две вещи внутри транзакции, и я не уверен, как это проверить в 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 проверяют оба случая, но я продолжаю получать ошибки. Если я добавлю (: require_new => true) к транзакции, он будет работать. Я думал, что это предназначено для вложенных транзакций, а не что-то вроде этого. Я что-то упускаю?

+0

Какие ошибки вы получаете? – NateSHolland

+0

model2 создается, когда модель1 взрывается (вызывает ошибку) –

+0

Ваши тесты всегда будут терпеть неудачу, так как 'Model.all' вернет' [] ', если нет записей. – fylooi

ответ

2

Откат транзакций ActiveRecord только в случае возникновения исключения. В противном случае они сохраняют все записи, которые были успешно созданы.

В вашем случае вы хотите использовать save! вместо save, чтобы прервать транзакцию. Это вызовет исключение ActiveRecord::RecordInvalid, которое вам нужно спасти и обработать.

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

У меня это, все еще не работает: rescue => e exception_info = {: class => e.class,: message => e.message,: backtrace => e.backtrace} @ logger.warn («Ошибка. Откат».:: Exception => exception_info) –

+0

@AmirShadaabMohammed Я забыл версию взлома, вы ее добавили? – fylooi

+0

Добавлено челки, все еще не работает –

Смежные вопросы