2014-09-24 2 views
3

은 내가 시험에 노력하고이 코드 조각이 :테스트를 위해 ActiveRecord :: RecordInvalid를 만드는 방법은 무엇입니까?

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

이 경우 블록에 들어갈를, 나는 올바른 ex PARAM을 전달해야합니다.

어떻게 ActiveRecord :: RecordInvalid를 만들 수 있습니까? 어떻게 인수 라이브러리가 찾고있는 입력 한 내용을 찾을 수 있습니까

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 

: RSpec에와

, 나는 이런 식으로 뭔가를 할 노력하고있어?

RecordInvalid link

답변

4

편집 : 이것은 레일 5.1.1 지금 가능하다. 레코드 인수 한 후에는 더 이상 필요하지 않습니다이 커밋 :를 제기 할 수처럼은 보이지 않는다

: 당신이 5.1.1에서 레일즈 버전에있는 경우 https://github.com/rails/rails/commit/4ff626cac901b41f86646dab1939d2a95b2d26bd

는 아래의 원래 대답을 참조 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

그래, 내가 끝내 준 바로 그 것이다. 유효한 레코드로도 작동하며 메시지가 없습니다. (사용자)} 'let! (: ex) {ActiveRecord :: RecordInvalid.new (user)}' –

0

으로 더블을 이해합니다. 나는

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

을하고 싶어하지만, RSpec에이 RecordInvalid를 인스턴스화하려고 할 때 그 ArgumentError: wrong number of arguments (0 for 1)을 제공합니다.

대신 나는 RecordInvalid 서브 클래스를 작성하고이 같은 initialize를 오버라이드 :
class MockRecordInvalid < ActiveRecord::RecordInvalid 
    def initialize 
    end 
end 

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

는 그 다음 rescue ActiveRecord::RecordInvalidMockRecordInvalidMockRecordInvalid.new.is_a?(ActiveRecord::RecordInvalid)true이다 잡을 것입니다.

관련 문제