2012-01-18 35 views
4
class A 
    include Logging 
    log_to 'whatever' 
end 

我想測試方法log_to是否被正確的參數調用。但正如您可能已經猜到的那樣,log_to方法來自Logging模塊,並在類加載時調用。如何編寫規範或自定義匹配器來檢查log_to 'whatever'是否被調用?如何爲類加載調用的類方法編寫規範?

即使我嘲笑上class Alog_to方法,是在規範沒有辦法看它是否會被調用,因爲它類加載過程中被調用。我試圖刪除常量並重新加載它似乎沒有工作。思考?

回答

3

這也許應該是從測試的大部分A類的功能的規範文件的單獨規範文件:

describe 'A' do 

    it 'should log when loaded' do 
    class A ; end 
    A.should_receive(:log_to).with('whatever') 
    require 'a' 
    end 

end 

我會考慮,不過,改變類的行爲的東西更容易測試。在結構上不常見的測試或具有棘手約束的測試也是代碼味道。

+0

我同意你的看法,但要做一個類別日誌到不同的文件,這樣做的方式纔有意義。不是嗎?如果不是,你能否以不同的方式提出建議? – Chirantan 2012-01-20 15:17:39

+0

@Chirantin,思考一下,你是對的 - 實施應該堅持下去。我會嘗試發明一種不同的方式來測試它 - 我對迄今爲止的建議並不滿意。 – 2012-01-20 16:17:12

1

您應該測試所需的結果,而不是實施細節。我將測試記錄模塊隔離是這樣的:

describe Logging do 
    TEST_IO = StringIO.new 

    # some stub class for testing 
    class Person 
    include Logging 
    log_to TEST_IO 

    def name 
     "Bob" 
    end 
    end 

    after do 
    TEST_IO.reopen 
    end 

    it "logs a method call to the given io" do 
    person = Person.new 
    TEST_IO.string.should eq("") 
    person.name 
    TEST_IO.string.should eq("name called\n") 
    end 

    # ... 
end 

而且我不知道我會測試使用該模塊在所有的,因爲它是非常簡單,它包含任何危險的邏輯真正的類。意外錯誤,如語法錯誤將被集成測試所捕獲。

相關問題