2015-11-06 56 views
2

我有一些函数需要在指令/服务等指令/服务中使用,但我不需要从外部访问这些指令/服务。例如:Angular,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有可能以某种方式将这些内部函数称为这些内部函数吗?

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

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

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

是否有任何npm模块可以让Jasmine做到这一点?有什么建议么?

+2

在这种情况下,我记得[测试接口,而不是实现](http://www.richardlord.net/blog/test-the-interface-not-the-implementation) – Sonata

回答

3

不幸的是,你不能,因为他们的范围内的其他功能。你没有办法在代码中引用这些函数,而Jasmine不能做任何魔术来让你这样做。这给你2种选择:

  1. 不要单元测试它们。正如@Sonata建议你应该测试一下界面(本质上是黑盒测试)。把一些输入,并检查输出是否正确。
  2. 更改您的架构,使其不再属于私人范围,您将可以对其进行测试。一般来说,我不主张这种方法,除非你有一个复杂的功能,你真的想通过单元测试。这种原因就是为什么有些人反对TDD这样的东西,因为你现在必须为你的测试设计架构,而不是软件的主要目的。
相关问题