【问题标题】:Where to declare ngMock module在哪里声明 ngMock 模块
【发布时间】:2015-07-01 23:14:16
【问题描述】:

我刚刚开始涉足 Angular 应用程序的单元和端到端测试。

我对应该在哪里声明 ngMock 和 ngMocke2e 模块感到困惑。我的bower.json 文件引用了ngMock,index.html 文件指向angular-mocks.js 脚本。

但是,当我在 app.js 的依赖项中声明 ngMock 时,应用程序将无法加载。此外,控制台中没有显示错误。

我需要使用这些模块进行测试,但将它们从app.js 注入应用程序似乎违反直觉。

【问题讨论】:

    标签: angularjs jasmine protractor ngmock


    【解决方案1】:

    您无需将 angular-mocks 添加到您的主 app.js 您需要将 angular-mocks 注入您的 karma conf 中,这是唯一需要它的地方。

    例如:

    module.exports = function(config) {
      'use strict';
    
      config.set({
    
        files: [
          'bower_components/angular/angular.js',
          'bower_components/angular-resource/angular-resource.js',
          ...
          'bower_components/angular-mocks/angular-mocks.js'
          ...
    
        ]
    
      });
    };
    

    【讨论】:

    • 谢谢托尼。只是为了说明混乱,我正在使用角度文档:链接。它说它需要作为依赖模块包含:angular.module('app', ['ngMock']);
    • @abyrne85 很高兴!角度文档不是最好的......我认为有几种方法可以使用它 - 在文档中它直接注入应用程序中的“常规”模块声明,但对于你的情况,有业力,只有业力需要它 - 您在应用程序中不需要它。它仅用于测试目的 - 帮助您将角度服务注入测试。就我个人而言,除了 karma conf 之外,我还没有看到它在任何地方注入过。
    【解决方案2】:

    正如 Tony Barnes 的回答中所述,您可以在 karma 配置中注册 ngMock 源文件。

    更深入地了解它的工作原理;一旦第一次调用 ngMock 的 inject 函数,它会执行应用程序的 bootstrap 并自动包含“ng”和“ngMock”模块以及为我们的单元测试注册的模块。

    这就是为什么我们不需要按照angular.module('app', ['ngMock']) 编写代码来设置我们的测试,但它也感觉有点神奇,因为这个引导步骤对我们来说并不明显。

    我写过很多AngularJS Unit Testing Tutorials,比如ngMock Fundamentals for AngularJS - Understanding Inject,它们更深入地介绍了gnomic 的概念。

    【讨论】: