Как отладить ошибку "[object ErrorEvent] thrown " в моих тестах Karma/Jasmine?


У меня есть несколько неудачных тестов, которые выводят только [object ErrorEvent] thrown. Я не вижу ничего в консоли, что поможет мне точно определить оскорбительный код. Есть ли что-то, что мне нужно сделать, чтобы отследить их?

[EDIT]: я запускаю Karma v1.70, Jasmine v2.7.0

11 64

11 ответов:

чтобы исправить это, вы должны запустить свои тесты без исходных карт в качестве обходного пути:

CLI v6. 0. 8 и выше
--source-map=false

Кинк В6.0.х ранние версии
--sourceMap=false

CLI v1.x
--sourcemaps=false

есть открытый вопрос по этому https://github.com/angular/angular-cli/issues/7296

обновление: У меня тоже была эта проблема, поэтому я просто перешел на последний cli и убедитесь, что все пакеты обновлены в package.json также я полностью переустановил node_modules так что теперь проблема ушла.

попробуйте, если вы получите более описательное сообщение об ошибке, запустив тест с терминала, например:

ng test -sm=false

в вашем тесте, вы можете заменить

it('should...')

С

fit('should...') 

теперь только тесты предшествуют fit будет работать. Оставить браузер открытым после выполнения теста выполнения теста такой:

ng test -sm=false --single-run false

лично я столкнулся с этой ошибкой дважды. Оба были вызваны только при вызове приспособление.detectChanges ().

The первый время, я решил его с помощью Строковой интерполяции более безопасно в моем .HTML-файл.

небезопасных пример:

<p>{{user.firstName}}</p>

Safe (r) пример (обратите внимание на вопросительный знак):

<p>{{user?.firstName}}</p>

то же самое может относиться к обязательным собственность:

<p [innerText]="user?.firstName"></p>

The второй время, я использовал DatePipe в моем .html-файл, но свойство mock то, что я использовал его, не было свиданием.

.HTML-файл:

<p>{{startDate | date: 'dd-MM-yyyy'}}</p>

.TS (mock-data) file (неправильно):

let startDate = 'blablah';

.TS (mock-data) file (правильно):

let startDate = '2018-01-26';

Если sourcemap=false не помогает, попробуйте 1) Откройте браузер, запустив тесты 2) Нажмите кнопку "отладка" 3) открыть консоль

ошибка будет там

enter image description here

TL; DR: это может быть связано с тестированием маршрутизации.

я [object ErrorEvent] thrown тоже. Час спустя, проследил его до одной строки кода.

this.username = this.userService.getUser(this.route.snapshot.paramMap.get('id'))[0];

проблема заключается в том, что тестовая среда пытается оценить this.route.snapshot.paramMap.get('id').

если я заменю его на 0,[object ErrorEvent] thrown уходит.

Мои приложения UserService есть такой пользователь как так:

public users = [ ["admin", "First name", "Surname", etc... ] ].

так 0 просто получает этот пользователь, по индексу 0.

в противном случае, когда обычно работает мое приложение,this.route.snapshot.paramMap.get('id') вычисляется, когда пользователь выбирает пользователя для редактирования из моей таблицы пользователей.

так в моем HTML,*ngFor="let user of users; index as i" петли для отображения всех пользователей, то routerLink="/edit/{{i}}" так что вы можете нажать на кнопки редактирования для каждого пользователя, который при нажатии пойти, например,http://localhost:4200/edit/0 для редактирования данных вышеупомянутого администратора пользователя.

для меня это было связано с тем, что обещание было разрешено в ngOnInit компонента. Я должен был использовать async,fakeAsync и отметьте, а также заглушите асинхронную службу с помощью spyOn

beforeEach(async(
  //... initialise testbed and component
))
beforeEach(fakeAsync(
  // ... setup mocks then call:
  component.ngOnInit()
  tick()
  fixture.detectChanges()
))

угловой-как модульный тестовый компонент с асинхронным вызовом службы

это связано с тем, что фреймворк jasmine не может обрабатывать тип ErrorEvent, поэтому он не извлекает сообщение об ошибке и вызывает error.toString() на этом объекте вместо этого.

Я только что подал вопрос на Жасмин РЕПО https://github.com/jasmine/jasmine/issues/1594

пока он не исправлен, вы можете временно исправить установленный пакет jasmine в папке node_modules. В моем случае это

node_modules/jasmine/node_modules/lib/jasmine-core/jasmine.js

а потом менять реализация ExceptionFormatter от этого

if (error.name && error.message) {
    message += error.name + ': ' + error.message;
} else {
    message += error.toString() + ' thrown';
}

этой

if (error.name && error.message) {
    message += error.name + ': ' + error.message;
} else if (error.message) {
    message += error.message;
} else {
    message += error.toString() + ' thrown';
}

это помогает определить проблему.

у меня была та же проблема. Такая ошибка происходит при попытке открыть что-нибудь null или undefined в шаблон. Убедитесь, что у вас есть проверка безопасности на этих переменных.

например, это вызовет [object: ErrorEvent], когда конфигурация не определена при загрузке компонента.

шаблон.HTML-код

<div *ngIf="config.options">
   .....
   ......
</div>

сделать это вместо

<div *ngIf="config?.options">
   .....
   ......
</div>

для меня проблема была в том, что у меня был тест, где я случайно использовал auth0-lock библиотека.

это оказалось асинхронной проблемой, потому что после того, как я добавил достаточно its в одной из моих спецификаций компонентов я смог получить полезное сообщение об ошибке, которое указывало на файл и строку в этом файле (это было связано с paramMap.

в спецификации, которая тестировала ParamMap, я просто добавил:

  describe('this test', () => {
    it('will succeed', () => {
      expect(true).toBeTruthy();
    });

    it('will succeed', () => {
      expect(true).toBeTruthy();
    });

    it('will succeed', () => {
      expect(true).toBeTruthy();
    });

    it('will succeed', () => {
      expect(true).toBeTruthy();
    });
  });

Как насчет очистки после каждого теста:

  afterEach(() => {
    TestBed.resetTestingModule();
  })

у вас может быть гонка или асинхронный тест, который не настроен правильно или используется неправильно. Я бы предположил, что случай отладки должен быть исправлен и игнорировать, что проходит командная строка. Просто продолжайте обновлять Karma Test runner (браузер) в случае ошибки [object ErrorEvent] thrown появляется периодически, затем убедитесь, что вы правильно реализовали условие асинхронности.

надеюсь, что это работает.