2014-01-21 2 views
3

я в настоящее время используется регистратор следующим образом:RSpec: Тестирование регистратора сообщений для блока синтаксиса

def log_stuff 
    logger.info { 'Info log message' } 
    logger.debug { expesive_action } 
end 

Но я хотел бы знать, если регистратор получает правильное сообщение с RSpec.

Если бы я просто передать протоколирование линии на вход, это было бы легко:

# logger.info('Info log message') 
expect(logger_mock).to receive(:info).with('Info log message') 

Но я не мог понять, как я мог бы сделать что-то подобное с синтаксисом блока.

Я специально хочу использовать этот синтаксис, так что expensive_action вызывается только тогда, когда уровень журнала установлен в DEBUG.

+0

И это слишком обременительно, чтобы просто рассчитать дорогостоящую операцию перед тестом, чтобы вы могли проверить ... Что, что работает функция отладки? –

+0

У меня вопрос не возникает. Я могу, конечно, запустить дорогостоящее_действие в тесте, но в настоящее время я не знаю, как проверить результат по сравнению с оценкой блока. – leifg

+0

Сравните их? ...... –

ответ

3

Это не что трудно, хотя чуть-чуть сложнее, чем ванильные ожидания:

expect(logger_mock).to receive(:info) do |&block| 
    expect(block.call).to eq('Info log message') 
    end 

в этом случае &block в вашей спецификации просто блок вы имеете в logger.info вызова. Поэтому вы должны явно вызвать его, а затем задать другое ожидание по возвращаемому значению. Вот как я это делаю, по крайней мере.

0

К сожалению, это довольно сложно, потому что блок ленивый.

Иногда вы можете решить это, насмехаясь над более низким уровнем. Например, info внутренне вызывает add, передавая тип журнала. Однако даже в этом случае насмешливый add не поможет вам, потому что блок передается дословно и не оценивается.

На этом этапе вы можете заблокировать выполнение expensive_action и проверить, было ли вызвано действие или нет. Конечно, это решение не сработает, если вы просто вернете строку в блоке, но только если вы вызовете другой метод, который вы можете издеваться.

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