Как отладить ошибку "[object ErrorEvent] thrown " в моих тестах Karma/Jasmine?
У меня есть несколько неудачных тестов, которые выводят только [object ErrorEvent] thrown
. Я не вижу ничего в консоли, что поможет мне точно определить оскорбительный код. Есть ли что-то, что мне нужно сделать, чтобы отследить их?
[EDIT]: я запускаю Karma v1.70, Jasmine v2.7.0
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';
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 библиотека.
это оказалось асинхронной проблемой, потому что после того, как я добавил достаточно
it
s в одной из моих спецификаций компонентов я смог получить полезное сообщение об ошибке, которое указывало на файл и строку в этом файле (это было связано с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(); }); });
у вас может быть гонка или асинхронный тест, который не настроен правильно или используется неправильно. Я бы предположил, что случай отладки должен быть исправлен и игнорировать, что проходит командная строка. Просто продолжайте обновлять Karma Test runner (браузер) в случае ошибки
[object ErrorEvent] thrown
появляется периодически, затем убедитесь, что вы правильно реализовали условие асинхронности.надеюсь, что это работает.