Angular,d3.js,使用Jasmine

时间:2015-11-06 03:23:05

标签: angularjs d3.js jasmine

我有一些函数需要在指令/服务等中被隔离,指令/服务使用,但是 我不需要从这些指令/服务之外访问。例如:

angular.module('result')
.factory('directiveCreationService', ['$http', dirService]);

function dirService($http){
     function helperFunc1(){...};
     function helperFunc2(){...};
  return {
         // Both functions use helperFunc1, helperFunc2
            usefulFunc1: function($http){...};
            usefulFunc2: function($http){...};
  };
};

我想单独测试helperFunc1和helperFunc2。测试usefulFunc1和usefulFunc2很简单:我只是在注入服务后直接在我的测试中访问它们,但是在那里 一种测试方式 helperFunc1,helperFunc2没有使它们可以被外界访问 (我不希望他们这样做,我希望他们保持私密,除了测试)? 我正在使用Jasmine。那么,Jasmine是否有可能以某种方式称呼它们 内在的功能?

我也对测试函数的一部分感兴趣,所以有没有办法在函数内部访问变量(本身就是函数)并进行测试而不实际为变量创建另一个函数并返回它?例如,我有一个很长的功能:

 longFunc(){
    // some d3.js code
    var1 = svg1.smth.smth.smth.....
    var2 = svg2.smth.smth.smth.....
}

我想在我的Jasmine测试中得到var1和var2而不实际暴露它们。显然,我需要这些var1,var2才能使我的longFunc工作,但不需要它们在我的代码中公开它们,因为没有其他外部代码需要它们。

是否有任何npm模块可以允许Jasmine执行此操作?有什么建议吗?

1 个答案:

答案 0 :(得分:3)

不幸的是,你不能,因为他们在另一个功能范围内。您无法在代码中引用这些功能,Jasmine无法做任何魔术让您这样做。这为您提供了两个选项:

  1. 不要对它们进行单元测试。正如@Sonata建议你应该只测试界面(基本上是黑盒测试)。输入一些输入,并检查输出是否正确。
  2. 更改您的体系结构,使其不再具有私有范围,然后您就可以对其进行测试。一般来说,我不提倡这种方法,除非你有一个复杂的功能,你真的想通过单元测试。这种原因就是为什么有些人反对像TDD这样的事情,因为你现在已经开始为你的测试而设计,而不是软件的主要目的。