【问题标题】:Angular, d3.js, test inner functions with JasmineAngular,d3.js,用 Jasmine 测试内部函数
【发布时间】:2015-11-06 17:03:37
【问题描述】:

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

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。测试有用的Func1和有用的Func2很容易:我只是在注入服务后直接在我的测试中访问它们,但是那里 一种测试方法 helperFunc1, helperFunc2 不让外部世界访问它们 (我不希望他们这样做,我希望他们除了测试之外保持私密)? 我正在使用茉莉花。那么,茉莉花中是否有可能以某种方式调用这些 内部函数?

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

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

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

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

【问题讨论】:

标签: angularjs d3.js jasmine


【解决方案1】:

不,很遗憾,您不能这样做,因为它们的范围在另一个函数中。您无法在代码中引用这些函数,而且 Jasmine 无法做任何魔术来让您这样做。这给您留下了 2 个选择:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多