2016-11-21 140 views
0

我試圖在單元測試我的代碼時變得更好 - 包括嘗試一些tdd。我有一個問題是我應該如何去測試一個解析csv文件的對象。讓我舉一個小例子單元測試 - 何時/如何存根?

class EventLog { 
    parse() { 
     // load csv file, create array of Events 
    } 

    getEvents(options) { 
     // depending on options, return correct set of events 
    } 
} 

class Event {} 

因此,首先,我想要寫我的getEvents方法,該方法可以確保不同的選擇產生正確的結果的測試。在這種情況下,我想創建一個存根來解析,我可以通過一組Events,然後對該數據集運行我的測試?

其次,我將需要測試解析方法。計劃測試簡單的東西,如文件不存在時,格式不符合預期,正確Events創建等。爲此,我應該只存儲一些示例.csv文件,涵蓋我需要的情況?或者將拉出loadCsv()的方法和存根更有效?

回答

1

該課程有多難?

如果很容易,就像一個需要一些字符串的解析器,那麼您可以考慮直接使用它。使用ES6類,您甚至可以聲明新的class TestEventLog extends EventLog並將繼承用作最小存根。這是最少的開銷,是我最喜歡的策略。

如果這個類特別複雜,記住用小的(單元)測試要關注一小部分代碼。如果你看到大量的方法從一個你沒有測試的類中調用,那是一種測試很差的味道。

在這種情況下,我可能會通過繼承和更換啓動:

class TestEventLog extends EventLog { 
    parse() { 
    // ignore arguments, return known test data 
    return [['foo', 1], ['bar', 2]]; 
    } 
} 

的指導原則應該是引入儘可能少的代碼越好。您編寫的支持測試的代碼越多,需要測試的代碼就越多。

+0

使用類似繼承的優點/缺點vs使用sinon stub方法? –

+0

@TroyCosentino通常很少,我只是喜歡繼承,因爲它的簡單性。你不能比'延伸'更多的點到點。當一個班級需要更復雜的嘲弄或者我不想要任何原始行爲時,存根就派上用場了。 – ssube

+0

真棒,謝謝你的信息!絕對有助於讓我的頭腦進入正確的心態 –