Ruby on rails 如何从Rspec特性规范测试Rails日志记录?

Ruby on rails 如何从Rspec特性规范测试Rails日志记录?,ruby-on-rails,ruby,logging,rspec,Ruby On Rails,Ruby,Logging,Rspec,告诉我如何从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/

告诉我如何从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)
故障/错误:访问操作路径
#已收到:包含意外参数的信息
预期:(“foobar”)
got:(没有args)
test.log
文件不包含
foobar
,因此在控制器操作有机会完成之前,测试似乎立即失败

是否有某种方法可以在功能规范中使用expect(Rails.logger)语法?

可以使用字符串或块。如果您正在调用块表单,那么它将给出这个“get:(no args)”输出

比如说

logger.info 'foobar'
…一条线上的所有人都将使用字符串调用.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')