【问题标题】:Why angular module's factory method should be redefined in the test mock为什么要在测试模拟中重新定义角度模块的工厂方法
【发布时间】:2016-04-09 08:10:26
【问题描述】:

在 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;
              }
         }
    }); 

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

【问题讨论】:

  • 这可能不是对服务本身的测试,而是对使用该服务的组件的测试。并且该服务被存根以返回众所周知的虚假数据。也就是说,只需监视真实的服务就可以达到同样的目的。
  • 你确认没有必要重新定义整个工厂及其方法已经定义了吗?
  • 此代码完全脱离上下文发布。所以我只能猜测作者为什么这样做。如果是测试服务本身,对我来说没有多大意义。如果要根据服务来测试组件,这是有道理的,但我通常使用 spy 来代替。但如果没有任何上下文,我可能会错过一个重要的难题。
  • 好的,只是间谍已经是一个足够的解决方案,现在我想我的问题代码中显示的技术对于模拟不存在的组件很有用。
  • 我找到了另一个很好的例子,当它需要通过模拟来重写已经存在的工厂时(或存根,我仍然不太了解区别):thejsguy.com/2015/01/28/…

标签: angularjs angularjs-ngmock


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多