在我的Gem的RSpec测试中模拟"Rails.logger"



我正在编写一个Ruby gem,下面是如何创建新Logger的实现。

我的gem可能在Rails内部使用,也可能不使用,所以它尝试在存在的情况下使用Rails.logger

require 'logger'
module MyLoggeer
def logger
@logger ||= rails_logger || Logger.new($stdout)
end
def rails_logger
if defined?(::Rails) && ::Rails.respond_to?(:logger) && !::Rails.logger.nil?
::Rails.logger
else
nil
end
end
end

我的gem没有在任何地方将Rails定义为常量。如果我想用RSpec测试上面的逻辑,有没有一种方法可以让我-

  1. 定义一个模拟Rails对象
  2. 它是否响应logger方法

我想我可以在我的规范文件中定义一个伪类,但我希望有一种方法可以轻松地模拟/截断它。

谢谢!

使用RSpec模拟,您可以使用double(如特技替身(为任何对象创建替身。

然后使用allow允许double接收消息,使用expect设置方法期望值。

let(:logger) do
instance_double("Logger")
end
let(:rails) do
double("Rails")
end
before do
allow(rails).to receive(:logger).and_return(logger)
stub_const("Rails", rails)
end

您还可以使用实例替身和类替身来创建现有类的替身-这将验证您是否只调用要替身的类上实际存在的方法。

stub_const将在一个示例的持续时间内截断一个常量的值。

最新更新