如何测试依赖于全局变量的业力中的角度代码?是的,我知道,全局变量是非常糟糕的主意,但有时它们是由于其他代码或依赖项而存在的。
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;
然后我可以通过模块使用的ret。
但是如何在业力中设置它?
答案 0 :(得分:3)
所以答案结果分为两部分。
global.G = "ABC"
(或您想要设置的任何内容。在应用程序本身中,如果文件引用了全局var,它将在加载时读取一次,就像它应该的那样。所以我把它转换成了一个函数。而不是让app的其他区域注入服务,例如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";
});
});