2013-05-08 85 views
0

我有一個狀態機在JS(簡化)有一個初始狀態,只有在任何事情發生之前設置。什麼是暴露私人javascript vars測試的最骯髒的方式?

define(function() { 
    var state = 'initial', 
     exports = {}; 

    exports.getState = function() { 
    return state; 
    }; 

    exports.doSomething = function() { 
    state = 'newState'; 
    }; 

    return exports; 
}); 

因爲國家是永久的,直到應用程序重新加載,第一次測試後的狀態永遠不會是「初始」又來了,所以我需要一種方法來重置。

這是最簡單的方法嗎?我應該...

a)只是使國家公開,但標記爲私人與_?

define(function() { 
    var exports = {}; 

    exports._state = 'initial' 

    exports.getState = function() { 
    return this.state; 
    }; 

    exports.doSomething = function() { 
    this.state = 'newState'; 
    }; 

    return exports; 
}); 

b)使狀態可以通過函數寫入?

define(function() { 
    var state = 'initial', 
     exports = {}; 

    exports.getState = function() { 
    return state; 
    }; 

    exports.doSomething = function() { 
    state = 'newState'; 
    }; 

    if(window.xxTests) { 
    window.xxTests.Module = { 
     setState: function(newState) { 
     state = newState; 
     } 
    }; 
    } 

    return exports; 
}); 

(XX是應用前綴和xxTests僅被定義爲測試運行的一部分)

C)做別的事情完全是我沒有想到的?

您的想法和建議表示讚賞。

+0

爲什麼不添加'exports.reset = function(){state ='initial'; };'? – Goodwine 2013-05-08 16:39:18

+0

這是一個選項,但與其他選項一樣,它允許在生產環境中應該只讀時訪問私有變量。 – 2013-05-08 16:45:10

回答

0

一般答案:測試組件的更好方法是在測試代碼內部放置測試代碼。當然,如果你的語言不能以一種乾淨的方式支持(比如D),那麼這會變得很髒。

在你的情況我建議第二種方式(我的意思是你的選項B),因爲它不公開的私人數據,除非明確需要(僅在測試):

if(youAreDoingATest) 
{ 
    exports.reset=function() { state='initial'; }; 
} 
0

這裏沒有很多關於如何運行測試的背景知識。

大多數測試跑步者有可用於安裝和拆卸運行他們的名字暗示beforeEach()beforeAll()afterEach()afterAll()方法。

爲了解決你的具體問題,我不會改變你的「狀態機」代碼,而是我會在beforeEach()函數中創建一個新的狀態機,以便每個測試獲得狀態設置爲'initial'的新函數對象, 。

相關問題