2014-09-24 44 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

相關問題