如何测试依赖于业力中的全局变量的角度代码?

时间:2014-10-08 09:46:03

标签: angularjs karma-runner

如何测试依赖于全局变量的业力中的角度代码?是的,我知道,全局变量是非常糟糕的主意,但有时它们是由于其他代码或依赖项而存在的。

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。

但是如何在业力中设置它?

1 个答案:

答案 0 :(得分:3)

所以答案结果分为两部分。

  1. 在测试者中:karma支持全局变量,只需将其设置在测试文件中即可。如果使用browserify,请使用global.G = "ABC"(或您想要设置的任何内容。
  2. 在应用程序本身。见下文。
  3. 在应用程序本身中,如果文件引用了全局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";
      });
    });