【问题标题】:How to stub out global logging function in rspec examples如何在 rspec 示例中删除全局日志记录功能
【发布时间】:2013-10-04 07:38:11
【问题描述】:

我正在使用一些记录到全局静态日志记录类的代码,例如:

GlobalLog.debug("Some message")

但是在我的测试中,我不想包含真正的日志,因为它引入了很多不需要的依赖项。所以我想模拟一下:

describe "some function" do
  before(:all) do
    log = double('log')
    GlobalLog = log
    log.stub(:debug)
  end
  ...
end

不幸的是,因为在每个示例之后都会清除双打,所以这是不允许的:

https://www.relishapp.com/rspec/rspec-mocks/docs/scope

如果我将before(:all) 更改为before(:each),代码可以工作,但我会收到警告:

warning: already initialized constant GlobalLog

这阻塞了我的测试输出,所以我想避免这个警告。有干净的解决方案吗?

【问题讨论】:

    标签: ruby unit-testing rspec code-cleanup


    【解决方案1】:

    在您的spec_helper.rb 中定义一次GlobalLog

    class GlobalLog
      class << self
        [:info, :debug, :warn, :error].each do |method|
          define_method(method) {|*|}
        end
      end
    end
    

    如果你想更清楚,你可以把它扔到spec/support

    【讨论】:

    • 我不得不修改以接受参数:define_method(method) { |*args|},但它基本上可以工作!
    【解决方案2】:

    为什么不存根原始的GlobalLog 对象方法?

    before(:each)
      GlobalLog.stub(:debug)
    end
    

    【讨论】:

    • 您的GlobalLog 类在哪里定义?
    • 我不知道,我特别不想知道:-)。这是隐藏在一些我不想关心的代码中的依赖项,因为它与我目前正在编写的测试无关。这就是为什么我希望把它存起来。
    猜你喜欢
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2017-08-26
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多