【问题标题】:Angular Jasmine tests fail with minified sourceAngular Jasmine 测试因缩小源而失败
【发布时间】:2016-03-30 11:08:20
【问题描述】:

我会尝试用一点抽象来解决这个问题,因为深入代码细节是没有用的。

我有一个 Angular 模块,它分为 2 个源文件,例如 source1.jssource2.js。然后我有 3 个单元测试文件,旨在测试 3 个角度服务/工厂/提供者。

项目布局如下:

root
|
-dist
   |
   -source.min.js
-src
   |
   -source1.js
   -source2.js
-tests
   |
   -unit
      |
      -service1.js
      -service2.js
      -service3.js

所有测试,使用 karma 和 jasmine 运行,通过并按预期工作。看看这个 karma 配置就明白了:

files: [

  'bower_components/angular/angular.min.js',
  'bower_components/angular-mocks/angular-mocks.js',

  'src/*.js',
  'tests/unit/*.js'
],

接下来我将 gulpjs 的 source1 和 source2 缩小为 source.min.js 并尝试使用缩小的文件运行测试,因此我将 karma 配置更改如下:

files: [

  'bower_components/angular/angular.min.js',
  'bower_components/angular-mocks/angular-mocks.js',

  'dist/*.js', // <--- see here.
  'tests/unit/*.js'
],

使用此配置,所有测试都因角度依赖注入而失败 - 看起来提供程序没有被解析。

什么可能导致这种情况?我的意思是,源代码应该是一样的。

【问题讨论】:

  • 您看到了什么错误?您的 source.min.js 是否在您的网站上正确运行?

标签: javascript angularjs gulp karma-jasmine


【解决方案1】:

这是角度、依赖注入和缩小的已知问题。此外,问题恰恰在于代码的细节。

案例 1:

如果没有显式注入,当使用声明的函数作为控制器时,Angular 会尝试从服务名称推断服务。

angular.module('app').controller('MyController', MyController);

function MyController(service1, service2, ...){ ... service1.doSomething ...}

案例 2:

通过显式注入,Angular 按照注入顺序使用控制器函数参数。

angular.module('app').controller('MyController', MyController);

MyController.$inject = ['service1', 'service2', ...]

function MyController(a, b, ...){ ... a.doSomething ... }

案例 1 每次缩小都无法正常工作,因为服务的名称会发生​​变化,并且 Angular 将无法仅通过查看它们的名称来推断 a、b 或 c 所指的服务。

但是,Case 2 每次都会起作用,因为 Angular 不必猜测,因为 $inject 告诉它 service1 是 a,service 2 是 b,依此类推。

如果您使用 Gulp 之类的构建实用程序,您可以使用 ng-annotate,它会在案例 1 中自动为您注入依赖项,您的代码应该仍然可以工作。

在我自己看来,作为风格问题,您应该使用案例 2。我倾向于遵循接近 John Papa's Angular Style Guide 的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2021-09-08
    • 1970-01-01
    • 2017-12-25
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多