我正在编写一个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测试上面的逻辑,有没有一种方法可以让我-
- 定义一个模拟
Rails
对象 - 它是否响应
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
将在一个示例的持续时间内截断一个常量的值。