【问题标题】:RSpec: Testing logger messages for block syntaxRSpec:测试记录器消息的块语法
【发布时间】:2014-02-10 21:25:14
【问题描述】:

我目前通过以下方式使用记录器:

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 时才会被调用。

【问题讨论】:

  • 而且在测试之前只计算昂贵的操作以便您测试......什么,调试功能有效?
  • 我不明白这个问题。我当然可以在测试中运行昂贵的_action,但我目前不知道如何根据块的评估来验证结果。
  • 我需要将输入值与方法进行比较。使用模拟很容易。但是,只有当我将值传递给方法而不是块时。那么你能提供一个具体的例子来说明你的建议吗?

标签: ruby logging rspec


【解决方案1】:

这并不那么困难,虽然比普通的预期要复杂一点:

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

在这种情况下,您的规范中的&block 只是您在logger.info 调用中的块。所以你必须显式调用它,然后对返回值设置另一个期望。至少我是这样做的。

【讨论】:

    【解决方案2】:

    不幸的是,这很棘手,因为该块是惰性求值的。

    有时您可以通过在较低级别进行模拟来解决此问题。例如,info 内部调用 add 传递日志类型。但是,即使在这种情况下,模拟 add 也无济于事,因为该块是逐字传递的,并且没有被评估。

    此时,您可能希望对expensive_action 的执行存根并检查该操作是否已被调用。当然,如果你只是在块中返回一个字符串,这个解决方案是行不通的,但只有当你调用另一个可以模拟的方法时。

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2016-06-04
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多