beforeEach在业力+摩卡失败,角度4升级

时间:2017-04-11 17:36:05

标签: unit-testing angular karma-runner karma-mocha

上下文

我已确认"绿色"构建在使用angular-cli 1.0.0和旧的angular2依赖项的master branch上。我的目标是从angular2升级到angular4。

升级后问题

  • 该应用程序正常工作
  • 单位测试使用ng testnpm run test等同于
  • 的业力失败

工作配置

具体而言package.json如下。

...
"dependencies": {
    "@angular/common": "^2.4.0",
    "@angular/compiler": "^2.4.0",
    "@angular/core": "^2.4.0",
    "@angular/forms": "^2.4.0",
    "@angular/http": "^2.4.0",
    "@angular/platform-browser": "^2.4.0",
    "@angular/platform-browser-dynamic": "^2.4.0",
    "@angular/router": "^3.4.0",
    ...
},
"devDependencies": {
    "@angular/cli": "1.0.0",
    "@angular/compiler-cli": "^2.4.0",
    ...
}

具有以下测试结果 Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 82 of 83 (skipped 1) SUCCESS (5.674 secs / 0.061 secs)

Angular 4升级未通过测试

当我尝试使用非常specific diff升级angular4依赖项时,应用程序运行成功,但是我得到了失败/重复的升级测试,如Chromium 53.0.2785 (Ubuntu 0.0.0): Executed 127 of 83 (32 FAILED) (skipped 2) (7.521 secs / 0.101 secs)

我发现结果令人着迷的是,除了我实际拥有的测试次数外,还有44次测试。似乎唯一失败的测试是正在运行的重复测试,并且在成功后直接失败。经过调查似乎这些测试如果在每次测试之前没有运行就会失败

Chrome 56.0.2924 (Linux 0.0.0): Executed 67 of 83 (13 FAILED) (0 secs / 0.11 secs)
      ✔ will raise a houseCreated event
Chrome 56.0.2924 (Linux 0.0.0) HouseListComponent when valid input is provided (while in create mode) will raise a houseCreated event FAILED
    AssertionError: expected { Object (country, state, ...) } to equal { Object (country, state, ...) }
        at Context.<anonymous> (webpack:///src/app/housing/components/edit/house-edit.component.spec.ts:69:40 <- src/test.ts:26683:54)
        at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:365:0 <- src/polyfills.ts:1520:26)
        at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvoke (webpack:///~/zone.js/dist/proxy.js:79:0 <- src/test.ts:88673:39)
        at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:364:0 <- src/polyfills.ts:1519:32)
        at Zone.run (webpack:///~/zone.js/dist/zone.js:125:0 <- src/polyfills.ts:1280:43)
        at Context.<anonymous> (webpack:///~/zone.js/dist/mocha-patch.js:88:0 <- src/test.ts:88521:33)
        at webpack:///~/zone.js/dist/mocha-patch.js:140:0 <- src/test.ts:88573:33
        at ZoneDelegate.invokeTask (webpack:///~/zone.js/dist/zone.js:398:0 <- src/polyfills.ts:1553:31)
        at Zone.runTask (webpack:///~/zone.js/dist/zone.js:165:0 <- src/polyfills.ts:1320:47)
        at drainMicroTaskQueue (webpack:///~/zone.js/dist/zone.js:593:0 <- src/polyfills.ts:1748:35)
        at ZoneTask.invoke (webpack:///~/zone.js/dist/zone.js:464:0 <- src/polyfills.ts:1619:25)
        at timer (webpack:///~/zone.js/dist/zone.js:1540:0 <- src/polyfills.ts:2695:29)
Chrome 56.0.2924 (Linux 0.0.0): Executed 68 of 83 (14 FAILED) (0 secs / 0.111 secs)
      ✖ will raise a houseCreated event 

配置损坏

...
"dependencies": {
    "@angular/common": "^4.0.1",
    "@angular/compiler": "^4.0.1",
    "@angular/core": "^4.0.1",
    "@angular/forms": "^4.0.1",
    "@angular/http": "^4.0.1",
    "@angular/platform-browser": "^4.0.1",
    "@angular/platform-browser-dynamic": "^4.0.1",
    "@angular/router": "^4.0.1",
    ...
},
"devDependencies": {
    "@angular/cli": "1.0.0",
    "@angular/compiler-cli": "^4.0.1",
    ...
}

对不同跑步者的相同测试

为了确定问题是测试还是跑步者,我使用wallabyjs跑步者运行了完全相同的测试,并得到No failing tests, 82 passing,它与使用升级的angular4依赖关系的master完全内联。这似乎表明问题是针对业力的,而不是测试。

资源

错误

有许多测试错误,但它们似乎都与beforeEach有关。测试模块不应该已经实例化,这似乎是重复测试的一个奇怪的副作用。

Chrome 56.0.2924 (Linux 0.0.0) car reducer "before each" hook for "will return array removes existing values when state is not empty" FAILED
    Error: Cannot configure the test module when the test module has already been instantiated. Make sure you are not using `inject` before `TestBed.configureTestingModule`.
        at TestBed.Array.concat.TestBed._assertNotInstantiated (webpack:///~/@angular/core/@angular/core/testing.es5.js:749:0 <- src/test.ts:25844:19) [ProxyZone]
        at TestBed.Array.concat.TestBed.configureTestingModule (webpack:///~/@angular/core/@angular/core/testing.es5.js:671:0 <- src/test.ts:25766:14) [ProxyZone]
        at Function.Array.concat.TestBed.configureTestingModule (webpack:///~/@angular/core/@angular/core/testing.es5.js:576:0 <- src/test.ts:25671:22) [ProxyZone]
        at Context.<anonymous> (webpack:///src/app/car/reducers/car.reducer.spec.ts:30:12 <- src/test.ts:31440:27) [ProxyZone]
        at ProxyZoneSpec.Array.concat.ProxyZoneSpec.onInvoke (webpack:///~/zone.js/dist/proxy.js:79:0 <- src/test.ts:88673:39) [ProxyZone]
        at Zone.run (webpack:///~/zone.js/dist/zone.js:125:0 <- src/polyfills.ts:1280:43) [<root> => ProxyZone]
        at Context.<anonymous> (webpack:///~/zone.js/dist/mocha-patch.js:88:0 <- src/test.ts:88521:33) [<root>]

然后在每次失败之后,我们会收到有关属性call

的更多错误
Chrome 56.0.2924 (Linux 0.0.0) car reducer "before each" hook for "will return array removes existing values when state is not empty" FAILED
    TypeError: Cannot read property 'call' of undefined
        at ZoneDelegate.invokeTask (webpack:///~/zone.js/dist/zone.js:398:0 <- src/polyfills.ts:1553:31)
        at Zone.runTask (webpack:///~/zone.js/dist/zone.js:165:0 <- src/polyfills.ts:1320:47)
        at ZoneTask.invoke (webpack:///~/zone.js/dist/zone.js:460:0 <- src/polyfills.ts:1615:38)
        at timer (webpack:///~/zone.js/dist/zone.js:1540:0 <- src/polyfills.ts:2695:29)
Chrome 56.0.2924 (Linux 0.0.0): Executed 45 of 83 (8 FAILED) (0 secs / 0.092 secs)

1 个答案:

答案 0 :(得分:0)

Karma应该避免frameworks数组中的多个引用。请改用plugins

围绕失败的beforeEach的这个问题实际上是一个红鲱鱼和重复测试的副作用。似乎正在执行的生命周期是:

  1. beforeEach
  2. it('myTest1') 传递
  3. it('myTest1') 失败
  4. beforeEach
  5. it('myTest2') 传递
  6. it('myTest2') 失败
  7. 如果我们停止重复测试,那么beforeEach问题实际上并不存在。这被消化并在karma issue中证明,结果是用户(我的)错误。

    要停止测试重复,我们需要更新frameworks中的karma.conf.js数组,并减少框架引用的数量,并使用已经引用的plugins

    frameworks: ['mocha', 'chai', 'sinon-chai', '@angular/cli'],

    变为

    frameworks: ['mocha', '@angular/cli'],

    分辨率

    停止重复测试,beforeEach将按预期运行。工作提交可以是found here

相关问题