2014-09-24 83 views
3

我有这样的一段代码,我想测试:如何创建ActiveRecord :: RecordInvalid进行测试?

def error_from_exception(ex) 
    if ex.is_a?(ActiveRecord::RecordInvalid) 
... 

要进入if块,我需要在正确的ex参数去传递。

如何创建一个ActiveRecord :: RecordInvalid?

使用RSpec,我试图做这样的事情:

context 'exception is ActiveRecord::RecordInvalid' do 
    it 'returns the validation error' do 
    begin 
     raise ActiveRecord::RecordInvalid 
    rescue Exception => ex 
     binding.pry 
     ### 
     # From my pry session: 
     # $ ex 
     # $ <ArgumentError: wrong number of arguments (0 for 1)> 
     # $ ex.class 
     # $ ArgumentError < StandardError 
     ### 
    end 


    end 
end 

如何找出参数键入库想要?

RecordInvalid link

回答

4

编辑:这是现在可以用Rails 5.1.1。该记录参数后,不再需要此承诺:https://github.com/rails/rails/commit/4ff626cac901b41f86646dab1939d2a95b2d26bd

如果你是在5.1.1下的Rails版本,请参见下面的原来的答案:

它似乎并不像它可能引发本身就是ActiveRecord::RecordInvalid。如果你看一下ActiveRecord::RecordInvalid的源代码,它初始化的时候需要一段记载:

class RecordInvalid < ActiveRecordError 
    attr_reader :record # :nodoc: 
    def initialize(record) # :nodoc: 
    @record = record 
    ... 
    end 
end 

(来源:https://github.com/rails/rails/blob/master/activerecord/lib/active_record/validations.rb

有些事情,你可以做些什么来解决,这将是简单地创建一个实际的记录中无效并尝试使用save!(例如在需要User.name时调用User.new.save!)将其保存。但是,请记住,如果您使用的模型已更改并且在您的测试中变得有效(将不再需要User.name),那么将来可能会成为问题。

+2

是的,这正是我最终做的。它也可以使用有效的记录,那里不会有任何消息。 (:ex){ActiveRecord :: RecordInvalid.new(user)}'let!(:user){FactoryGirl.create(:user)}' 'let! – 2014-09-24 20:38:48

0

我需要做类似的测试我的代码在处理ActiveRecord::RecordInvalid东西。我想做

allow(mock_ar_object).to receive(:save!).and_raise(ActiveRecord::RecordInvalid) 

但是,让ArgumentError: wrong number of arguments (0 for 1)当RSpec的尝试实例RecordInvalid

相反,我写了一个RecordInvalid子类,并推翻initialize这样的:

class MockRecordInvalid < ActiveRecord::RecordInvalid 
    def initialize 
    end 
end 

allow(mock_ar_object).to receive(:save!).and_raise(MockRecordInvalid) 

然后,rescue ActiveRecord::RecordInvalid将赶上MockRecordInvalidMockRecordInvalid.new.is_a?(ActiveRecord::RecordInvalid)true

相关问题