在 Angular 1.5 中将模块注入业力测试

Posted

技术标签:

【中文标题】在 Angular 1.5 中将模块注入业力测试【英文标题】:Inject a module into karma test in Angular 1.5 【发布时间】:2016-07-04 03:57:29 【问题描述】:

我正在尝试将我的 Angular 应用程序从 1.3.x 升级到 1.5.1。当我使用 Angular 1.3.x 版本时,我有一套测试在 Karma + PhantomJS 上运行良好,但是一旦我升级了所有测试都失败了。看来我之前将模块注入单元测试的方式不再有效。

这在 1.5 中失败:

'use strict'
 App = null

 fdescribe 'App Model', ->
   beforeEach module('MyAngularApp')

   beforeEach inject ($injector)->
     App = $injector.get('App')

 it 'should exist', ->
   console.log 'App:', App
   expect(App).toBeDefined()

我也尝试过注入以下内容

 beforeEach inject ($injector, _App_)->
   App = _App_

但我的 App 模型仍未注入。

我一直在研究 AngularJS 1.5.1 的文档,但我没有看到我需要对注入器进行任何更改。

在 Angular 1.5.x 中,如何正确地将模型注入到我的单元测试中?

【问题讨论】:

【参考方案1】:

好的,看起来问题实际上是升级导致angular-mocks 的第二个副本被捆绑到应用程序中。我不确定这是否来自 AngularJS、Karma 或 PhantomJS,但从 karma.conf.js 的配置中包含的文件中删除 angular-mock.js 文件解决了这个问题。似乎 PhantomJS 错误日志并没有提供足够的洞察力来了解实际问题是什么。

对于遇到此问题的其他人,我注意到将我正在测试的浏览器更改为 Chrome(而不是 PhantomJS 2)会导致不同的错误消息:

Error: [$injector:modulerr] Failed to instantiate module ng due to:
Error: [$injector:modulerr] Failed to instantiate module ngLocale due to:
RangeError: Maximum call stack size exceeded

这让我找到了解决方案:https://github.com/angular/angular.js/issues/11303

【讨论】:

遇到了类似的问题,inject 似乎不起作用,但它与angular-mocks 无关,但是将浏览器更改为Chrome 给了我一些有意义的错误消息我可以解决它。 我遇到了同样的问题,这个解决方案对我有用 - 谢谢!需要明确的是:问题是 angular-mock.js 被包含了两次。 (一次在捆绑包中,一次在业力配置中),如果您只包含一次,错误就会消失。

以上是关于在 Angular 1.5 中将模块注入业力测试的主要内容,如果未能解决你的问题,请参考以下文章

测试可观察对象 Angular 2 业力

针对订户错误的 Angular 2 业力单元测试

无法使用 chrome-headless 在 docker 中运行 angular-cli 业力测试

如何使用 gitlab CI 解决 Angular 业力测试的 chrome 错误?

angular2应用程序中的业力测试异常

Angular 8 业力忽略服务请求