2014-10-08 56 views
0

我如何測試依賴於全局變量的業力角碼?是的,我知道,全局變量是一個真的很糟糕的想法,但有時它們存在是由於其他代碼或依賴關係。如何測試依賴於業務中全局變量的角碼?

E.g.如果我依賴名爲G的全局變量,我已將它完全隔離爲一個文件,該文件爲應用程序的所有其他部分設置該文件並將其作爲服務提供,但我仍然需要測試我的角碼時間或沒有設置。

describe('G is not set',function(){ 
    beforeEach(function(){ 
    // need to set a global var G here 
    }); 
}); 
describe('G is set',function(){ 
    beforeEach(function(){ 
    // need to set a global var G here 
    }); 
}); 

代碼本身可能是一個簡單的

var ret = typeof(G) === "undefined" ? {} : G; 

然後我可以通過保留在其上使用的模塊。

但我怎麼設置因果報應?

回答

3

因此,答案原來是兩個部分。

  1. 在測試人員:karma支持一個全局變量,只需將其設置在測試文件中。如果使用browserify,使用global.G = "ABC"(或任何你想將它設置爲。
  2. 在應用程序本身。見下文。

在應用程序本身,如果該文件引用全局變量,它會被讀取一旦在加載時,因爲它應該。所以我把它轉換成一個功能,而是具有應用的其他領域注入的服務,如Greader,然後做

if (Greader.info === "1") { 
    // do something 
} else { 
    // do something else 
} 

我轉換Greader.info到的函數(或者使用getter,如果您願意的話),它讀取全局var實時:

if (Greader.info() === "1") { 
    // do something 
} else { 
    // do something else 
} 

並由此Greader.info樣子(簡化):

Greader = function() {return (typeof(G) === "undefined" ? {} : G);}; 

換句話說,它在實時讀取它。然後我的測試中可以輕鬆地進行設置:

describe('G is not set',function(){ 
    beforeEach(function(){ 
    global.G = null; 
    }); 
}); 
describe('G is set',function(){ 
    beforeEach(function(){ 
    global.G = "ABC"; 
    }); 
});