Angular Jasmine测试因源缩小而失败
Angular Jasmine tests fail with minified source
我将尝试用一点抽象来处理这个问题,因为深入了解代码细节是无用的。
我有一个角度模块,它分为两个源文件,比如source1.js
和source2.js
。然后我有3个单元测试文件,设计用于测试3个角度服务/工厂/提供商。
项目布局如下:
root
|
-dist
|
-source.min.js
-src
|
-source1.js
-source2.js
-tests
|
-unit
|
-service1.js
-service2.js
-service3.js
所有的测试,运行与因果报应和茉莉花,通过和工作的预期。查看这一点因果报应配置来获得要点:
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'
],
使用此配置,由于角度依赖注入,所有测试都会失败——看起来提供程序没有得到解决。
是什么原因造成的?我的意思是,源代码应该是相同的。
这是一个已知的角度、依赖项注入和缩小问题。此外,问题恰恰在于代码的细节。
情况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所指的服务。
然而,情况2每次都会起作用,因为angular不必猜测,因为$inject告诉它服务1是a,服务2是b,依此类推
如果你使用像Gulp这样的构建实用程序,你可以使用ng注释,它将在案例1中自动为你注入依赖项,你的代码应该仍然可以工作。
在我看来,作为一种风格,你应该使用案例2。我倾向于遵循John Papa的Angular Style Guide
相关文章:
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 如何在d3上的图形中添加放大和缩小按钮
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- jQuery.getJSON失败,语法错误
- ng disabled在放入多个表达式时失败
- Jasmine单元测试在监视服务方法时失败
- AmCharts缩小事件
- jQuery分页下一页和上一页按钮在点击零或超过最后一页后失败
- 在iframe的情况下,jQuery html()将失败
- 在我的情况下,使用带有变量失败的 jquery 选择器
- Angular Jasmine测试因源缩小而失败
- Ace文本编辑器-“;要求“;如果源被缩小,则失败