0

在 angular.js 教程中,我发现了这个工厂测试示例:

模块:

angular.module('omdbModule', [])
    .factory('omdbApi', function omdbApiFactory() { 
          return { 
              search: function() {
                 //logic to get data return movieData;
          }
    }

测试(它可以通过两种方式进行:传递一个带有“$provide”作为参数的匿名函数:

 angular.mock.module(function($provide){
         $provide.factory('omdbApi', function(){ 
             return{
                search:function(query){
                  return movieData;
              }
         }
    });

或仅使用对象文字:

 angular.mock.module({
         'omdbApi':{
              { search:function(query){
                  return movieData;
              }
         }
    }); 

在这两种情况下,我都不明白为什么必须在模拟中重新定义搜索功能,而不是仅仅获取工厂,然后自动访问其所有属性和方法。我认为在模拟中定义整个工厂是很好的,以防它在模块中并不真正存在,但是为什么在模块及其工厂已经定义并且它们确实存在时这样做呢?

4

1 回答 1

0

模拟服务的原因之一是防止需要固定装置(非$httpXHR 请求、DOM 操作)或具有太多移动部件的不良操作。

另一个很好的理由是防止测试交叉污染。如果单元 A 坏了,开发人员可能想知道究竟是什么坏了。如果 B 和 C 单元测试也是红色的,那就更难了,所以应该按照面包屑来确定麻烦制造者是否是 A。如果面包屑停止并且最终调试应用程序和规范而不是修复,那就变得更加困难-and-go 类型的工作。

除非测试需要一个对象一起测试多个单元(这是集成测试,它补充单元测试而不是替换它们),否则单独测试每个单元。

于 2016-04-09T13:10:34.083 回答