【发布时间】:2018-12-27 09:23:09
【问题描述】:
我们有一个中等大小的 Angular 应用程序,目前有大约 700 个单元测试。 几周前,完美的测试开始打破。更奇怪的是:运行两次测试会产生不同的结果,即不同的测试可能会中断。 在控制台中,我们总是发现错误:
未捕获的类型错误:您在预期流的位置提供了“未定义”。
但是堆栈跟踪没有提示错误的根源实际位于何处(请参阅本文末尾)。堆栈跟踪显示与 mergeMap 运算符的连接,但事实证明,我们在应用程序和测试中都没有使用此运算符。
我浏览了所有规范文件并让它们自行运行(使用fdescribe)。每个规范文件都通过而没有错误。将它们一起运行会导致所描述的损坏。
当然,我的猜测是我们遇到了异步问题,所以我努力完成所有测试并将每个测试都包装在异步环境中。我还检查了每个订阅都在某个时候被取消订阅 - 我们的应用程序就是这种情况,但我们的测试并不总是如此。 但是,错误仍然存在。
这对我们的项目来说是个大问题。非常欢迎任何建议。 也许有人知道找到导致问题的测试部分的方法?
我们现在使用 jasmine 3.3.0、karma v3.1.4 和 Angular 7.1.3。 我们在一周前做了 jasmine 和 angular 的更新,因为我们希望能解决这个问题。只有一件事发生了变化:在更新之前,测试不是随机中断,而是在固定数量的测试中中断(在我们的例子中,639 次测试会导致测试中断,638、640、641 等会通过;648会再次破裂)。我认为这与 jasmine 现在使用的随机种子有关。
这是完整的堆栈跟踪:
<!-- language: lang-none -->
Uncaught TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
at subscribeTo (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/util/subscribeTo.js:41)
at subscribeToResult (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js:11)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._innerSub (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/operators/mergeMap.js:74)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/operators/mergeMap.js:68)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/operators/mergeMap.js:51)
at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/Subscriber.js:54)
at Observable._subscribe (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js:5)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/Observable.js:43)
at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/Observable.js:29)
at MergeMapOperator.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapOperator.call (:9876/_karma_webpack_/webpack:/node_modules/rxjs/_esm5/internal/operators/mergeMap.js:29)
at ____________________Elapsed_3_ms__At__Thu_Dec_27_2018_10_03_35_GMT_0100__Mitteleurop_ische_Normalzeit_ ()
at Object.onScheduleTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:108)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:401)
at Object.onScheduleTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:297)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:401)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.scheduleTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:232)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.scheduleMacroTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:255)
at scheduleMacroTaskWithCurrentZone (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:1114)
at :9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:2090
【问题讨论】:
-
您是否也搜索过
flatMap的出现,它只是mergeMap的别名,因此我可以想象堆栈跟踪中说明了这一点? -
您必须提供一些代码,然后我们才能找出问题所在!
标签: jasmine rxjs karma-jasmine