2013-06-22 3 views
0

Я пытаюсь обновить переменную экземпляра @status на объекте, основанном на производительности блока. Этот блок также вызывает вызовы в другой класс.Выполнение исключения, но оценка обычно (RSpec)

def run 
    @entries.keep_if { |i| valid_entry?(i) }.each do |e| 
    begin 
     unique_id = get_uniqueid e 
     cdr_record = Cdr.find_by_uniqueid(unique_id).first 
     recording = cdr_record.nil? ? NullAsteriskRecording.new : AsteriskRecording.new(cdr_record, e) 
     recording.set_attributes 
     recording.import 
    rescue Exception => e 
     fail_status 
    end 
    end 
end 

fail_status частный метод, который обновляет переменную экземпляра в :failed. Пробивая некоторые другие вещи, я в основном проверял, работает ли этот код, но я хочу, чтобы тест был на месте. В настоящее время у меня есть следующее:

context "in which an exception is thrown" do 
    before do 
    @recording = double("asterisk_recording") 
    @recording.stub(:import).and_raise("error") 
    end 

    it "should set #status to :failed" do 
    # pending "Update instance variable in rescue block(s) of #run" 
    subject.run 
    subject.status.should eq :failed 
    end 
end 

Но тест всегда терпит неудачу. Блок rescue никогда не оценивается (я проверил с оператором puts, который будет оцениваться, когда я жестко запрограммирован в операторе raise). Здесь я использую функцию double? Или я делаю сам, удалив исключение, поэтому блок rescue никогда не запускается?

ответ

0

Вы установили @recording в свой предыдущий блок, но код, который вы отправили для вашего метода запуска, не будет использовать этот экземпляр @recording, и поэтому вызов метода record.import в методе run не приведет к возникновению исключения.

В вашем методе запуска запись может либо оказаться экземпляром NullAsteriskRecording, либо AsteriskRecording. Если вы знаете, что это будет AsteriskRecording, как предполагает ваш текущий тест, один из подходов состоит в том, чтобы изменить ваш блок до следующего:

before do 
    AsteriskRecording.any_instance.stub(:import).and_raise("error") 
end 
+0

Удачи, было бы так просто. Благодаря! Объяснение было замечательным. –

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

  • Нет связанных вопросов^_^