2013-10-04 23 views
1

我有一些代碼,記錄到一個全局靜態日誌類,如工作:如何存根出全球性的日誌記錄功能在RSpec的例子

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 

這堵塞了我的測試輸出,所以我想避免警告。有一個乾淨的解決方案嗎?

回答

3

在您的spec_helper.rb中定義GlobalLog一次。

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

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

+0

我不得不修改參數:'define_method(method){| * args |}',但它基本上可行! – Stefan

+0

謝謝,我補充了更正。 – davogones

1

爲什麼你不存在原始GlobalLog對象的方法?

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

因爲我得到:'NameError:未初始化的常量GlobalLog' – Stefan

+0

你在哪裏定義了你的'GlobalLog'類? –

+0

我不知道,我特別不想知道:-)。這是一種隱藏在某些我不想關心的代碼中的依賴關係,因爲它與我目前正在編寫的測試無關。這就是爲什麼我希望能夠將它剔除。 – Stefan