【问题标题】:How to mock a module in angular如何以角度模拟模块
【发布时间】:2016-05-07 23:40:30
【问题描述】:

所以我已经阅读了很多帖子,但到目前为止没有任何建议。

我想模拟一个模块 - 比如说 angular-foo。原始文件与其他所有内容一起加载。

angular.module('app', ['angular-foo'...

我想在我的 karma/mocha 测试中模拟这个模块。我已经尝试过诸如这样称呼它的建议,但这是不行的。

beforeEach(module('app'));

beforeEach(module('angular-foo'))

我怎样才能完全阻止原始的 angular-foo 运行(但它必须作为其余代码的一部分加载)?

【问题讨论】:

    标签: angularjs unit-testing


    【解决方案1】:

    要模拟factoryservicevalue 服务,可以使用angular.mock.module object argument

    beforeEach(module('app', 'angular-foo', {
      fooFactoryService: ...,
      fooValueService: ...
    }));
    

    要在配置阶段模拟可用于注入的服务(constantprovider),应使用 config 函数

    beforeEach(module('app', 'angular-foo', ($provide) => {
      $provide.constant('fooConstantService', ...),
      $provide.provider('fooProviderService', ...),
    }));
    

    该行中的最后一个模块会覆盖其他模块的服务。可以部分(使用$provide.decorator)或全部模拟服务。

    如果 angular-foo 模块根本没有加载,但其他模块使用它,它可以在规范中使用其模拟版本完全重新定义

    angular.module('angular-foo', [])...
    beforeEach(module('app', 'angular-foo'));
    

    【讨论】:

    • 感谢您让我走上正轨:angular.module('angular-stripe', ]).provider('stripe', { setPublishableKey: function() { }, $get: function() {} }); beforeEach(module('app'));
    【解决方案2】:

    对我来说,诀窍是将提供程序放在模块声明之前:

      beforeEach(module(function($provide) {
        $provide.provider('myProvider', function() {
          return {
            myProviderFunction: function() {},
    
            $get: function () {
              return {
                myProviderFunction: function() {}
              };
            }
          };
        });
      }));
    
      beforeEach(module('myApp'));
    

    【讨论】:

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