2014-09-23 6 views
0

У меня есть метод, который регистрирует ошибки. Он принимал сообщение об ошибке как параметр, но теперь он принимает полную ошибку и вызывает на нем .backtrace. Метод ниже:mocking сообщение об ошибке в Rspec при вызове метода .backtrace

def log_error(error) 
    puts error.backtrace 
    puts "RECONCILE_TAX_RATES [#{Time.now}] ERROR [#{error.message}]" 
    end 

Я пытаюсь проверить его, и я не могу определить синтаксис теста. То, что я имел в своем распоряжении есть:

it 'logs errors' do 
    time = "Tue, 16 Sep 2014 20:18:19 UTC +00:00" 
    Timecop.freeze(time) do 
     tax_reconciler = TaxReconciler.new 
     error_message = "I'm sorry, Dave. I'm afraid I can't do that." 
     expected = "RECONCILE_TAX_RATES [2014-09-16 20:18:19 UTC] ERROR [I'm sorry, Dave. I'm afraid I can't do that.]" 

     STDOUT.should_receive(:puts).with(expected) 
     tax_reconciler.log_error(error_message) 
    end 
    end 

Я пробовал различные комбинации из документации RSpec, но я продолжаю получать споткнулся о методе .backtrace. Как я могу издеваться над этим сообщением об ошибке, чтобы .backtrace не взорвался? Заранее благодарим за вашу помощь и дайте мне знать, если мне нужно больше информации.

Edit: Для тех, кто с подобной проблемой решение я был:

it 'logs errors' do 
    time = "Tue, 16 Sep 2014 20:18:19 UTC +00:00" 
    Timecop.freeze(time) do 
     expected = "RECONCILE_TAX_RATES [2014-09-16 20:18:19 UTC] ERROR [I'm sorry, Dave. I'm afraid I can't do that.]" 
     tax_reconciler = TaxReconciler.new 
     begin 
     raise "I'm sorry, Dave. I'm afraid I can't do that." 
     rescue => error_message 
     STDOUT.should_receive(:puts).with(expected) 
     STDOUT.should_receive(:puts).with(error_message.backtrace) 
     tax_reconciler.log_error(error_message) 
     end 
    end 
    end 

ответ

1

Я хотел бы сделать это следующим образом:

describe '#log_error' do 
    let(:time) { 'Tue, 16 Sep 2014 20:18:19 UTC +00:00' } 
    let(:message) { 'The message' } 
    let(:error) { double(:message => message, :backtrace => []) } 
    let(:line) { 'RECONCILE_TAX_RATES [2014-09-16 20:18:19 UTC] ERROR [The message]' } 

    subject(:tax_reconciler) { TaxReconciler.new } 

    before { allow(STDOUT).to receive(:puts) } 

    it 'logs errors' do 
    Timecop.freeze(time) do 
     tax_reconciler.log_error(error) 
     expect(STDOUT).to have_receive(:puts).with(line) 
    end 
    end 
end 
+0

когда я пытаюсь таким образом я получаю: неопределенный метод 'позволяют 'для #

+1

Метод 'allow' поставляется с драгоценным камнем' rspec-mocks'. Смотрите: https://github.com/rspec/rspec-mocks – spickermann

+0

У меня есть rspec-mocks в приложении, но более старая версия (2.12.2.). Есть ли синтаксис, поддерживаемый этой более старой версией? Приложение довольно большое, поэтому я не хочу обновлять и прерывать все остальные тесты, если 3.1.1 не поддерживает обратную совместимость. –

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