gpt4 book ai didi

ruby-on-rails - 如何从 Rspec 功能规范测试 Rails 日志记录?

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:35 24 4
gpt4 key购买 nike

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

# 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,因此在 Controller 操作有机会完成之前,测试似乎立即失败。

有什么方法可以在功能规范中使用这种 expect(Rails.logger) 语法吗?

最佳答案

Rails.logger.info method可以带一个字符串或一个 block 。如果您正在调用 block 形式,那么它将给出此“got: (no args)”输出。

例如

logger.info 'foobar'

...all on one line 将调用带有字符串的 .info,但如果您这样做

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

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

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

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

他在这个问题上苦苦思索了几个小时后,有意地说:-)

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

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')

关于ruby-on-rails - 如何从 Rspec 功能规范测试 Rails 日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38559046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com