Угловые тесты разбиваются случайным образом: «Uncaught TypeError: вы указали« неопределенное »там, где ожидался поток». - PullRequest
0 голосов
/ 27 декабря 2018

У нас есть угловое приложение среднего размера, в настоящее время около 700 юнит-тестов.Несколько недель назад начались прекрасные испытания.Даже более странно: запуск тестов дважды может привести к разным результатам, то есть разные тесты могут сломаться.В консоли мы всегда находим ошибку:

Uncaught TypeError: Вы указали 'undefined', где ожидался поток.

Но трассировка стека не дает подсказкигде на самом деле находится корень ошибки (см. конец этого поста).Трассировка стека показывает соединение с оператором mergeMap, но оказывается, что мы используем этот оператор не там, где в нашем приложении, и нигде в наших тестах.

Я прошел все спецификации и позволил им работатьсвои (с fdescribe).Каждый файл спецификаций проходит без ошибок.Запуск их всех вместе приводит к описанной поломке.

Конечно, я предположил, что мы столкнулись с проблемой асинхронности, поэтому я приложил усилия, чтобы пройти все тесты и обернуть каждый из них в асинхронную среду.Я также проверил, что каждая подписка в какой-то момент отписывается - это имело место для нашего приложения, но не всегда для наших тестов.Однако ошибка все еще сохраняется.

Это большая проблема для нашего проекта.Любой совет очень приветствуется.Может быть, кто-нибудь знает способ найти ту часть наших тестов, которая вызывает проблему?

Мы сейчас используем jasmine 3.3.0, karma v3.1.4 и Angular 7.1.3.Мы сделали обновление жасмина и ангуляра неделю назад, потому что надеялись избавиться от проблемы.Изменилось только одно: до обновления тесты выполнялись не случайно, а с фиксированным числом тестов (в нашем случае 639 тестов вызовут тест, 638, 640, 641 ... и т. Д. Пройдут; 648сломался бы снова).Я предполагаю, что это как-то связано со случайным начальным числом, которое сейчас использует жасмин.

Вот полная трассировка стека:

<!-- 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

1 Ответ

0 голосов
/ 23 апреля 2019

Оооо, звучит так, как будто все пошло не так.Недавно мы столкнулись со случайным нарушением юнит-тестов.Вы постоянно обновляли свои версии Angular и Karma?

Мы столкнулись с тем, что изменился способ настройки модульных тестов по умолчанию (с помощью Angular CLI), а старые тесты не выполнялись должным образом async путей.

Ошибка, которую вы видите, действительно отличается от того, что мы видели, но я уверен, что это путь, который стоит изучить, чтобы устранить любые ошибки, введенные настройкой модульных тестов.

Как взято из https://angular.io/guide/testing#calling-compilecomponents

describe('BannerComponent', () => {
    let component: BannerComponent
    let fixture: ComponentFixture<BannerComponent>

    beforeEach(async(() => {
      TestBed.configureTestingModule({
        declarations: [ BannerComponent ],
      }).compileComponents();  // compile template and css
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(BannerComponent)
        component = fixture.componentInstance
        fixture.detectChanges()
    })

    it('should create', () => {
        expect(component).toBeTruthy()
    })

Дополнительное внимание к первому beforeEach(), в котором есть async() => {} и требуемый .compileComponent().

Второй beforeEach() должен определить и заполнить переменную component в общем контексте describe().

Надеюсь, это поможет вам понять, что является причиной беспорядка.Поскольку проблема итератора, вытекающая из RxJS, похоже, указывает на тест, который основывается на состоянии, заданном предыдущим тестом, где он получает входные данные в форме Observable.Если этот Observable установлен или определен позже, чем выполнение тестов, вы можете столкнуться с проблемами, подобными той, которую вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...