【问题标题】:How do I test Rails logging from an Rspec feature spec?如何从 Rspec 功能规范测试 Rails 日志记录?
【发布时间】:2016-11-28 06:45:42
【问题描述】:

This question 告诉我如何从 RSpec 模型和控制器规范测试记录器语句。不幸的是,它似乎不适用于功能规范。使用此代码:

# controller.rb
def action
  logger.info 'foobar'
end

# spec.rb
scenario 'logging should work' do
  expect(Rails.logger).to receive(:info).with('foobar')
  visit action_path
end

我得到错误:

 Failure/Error: visit action_path
   #<ActiveSupport::Logger:0x007ff45b6e5ad0> received :info with unexpected arguments
     expected: ("foobar")
          got: (no args)

test.log 文件不包含 foobar,因此在控制器操作有机会完成之前,测试似乎立即失败。

有没有办法在功能规范中使用这种expect(Rails.logger) 语法?

【问题讨论】:

标签: ruby-on-rails ruby logging rspec


【解决方案1】:

Rails.logger.info method 可以采用字符串或块。如果您正在调用块形式,那么它将给出“得到:(无参数)”输出。

例如

logger.info 'foobar'

...all on one line 将使用字符串调用 .info,但如果你这样做了

logger.info
  "foobar foobar longer message so I'll put it on its own line"

在没有括号的情况下分成两行,那么你实际上是在传递一个块。添加一些括号...

logger.info(
  "foobar foobar longer message so I'll put it on its own line"
)

...你又回到了一个字符串。

他在这个问题上猛烈抨击了几个小时后明知故犯地说 :-)

在意识到这一点之前,我开始研究如何模拟 Rails.logger 类。这对您或其他人来说可能是一种有用的方法。也许您出于其他原因使用块调用(与功能与控制器规范有关?),或者您可能无法更改调用代码,在这种情况下......这样的事情可能是一个有用的起点:

class LoggerMock < Object
  def initialize; end

  def info(progname = nil, &block)
    mock_info(block.call)
  end
end

logger_mock = LoggerMock.new
allow(Rails).to receive(:logger).and_return(logger_mock)
expect(logger_mock).to receive(:mock_info).with('foobar')

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多