J'ai plusieurs tests qui échouent et qui ne produisent que [object ErrorEvent] thrown
. Je ne vois rien dans la console qui m'aide à identifier le code incriminé. Dois-je faire quelque chose pour les retrouver?
[EDIT]: J'utilise Karma v1.70, Jasmine v2.7.0
Pour résoudre ce problème, vous devez exécuter vos tests sans recourir à des cartes mères comme solution de contournement:
CLI v6.0.8 et supérieur--source-map=false
CLI v6.0.x versions antérieures--sourceMap=false
CLI v1.x--sourcemaps=false
Le raccourci
ng test -sm=false
pourrait aussi fonctionner
Il existe un problème en suspens à ce sujet https://github.com/angular/angular-cli/issues/7296
UPDATE: J'avais ce problème aussi, alors je viens de migrer vers le dernier cli et je m'assure que tous les paquetages sont mis à jour dans package.json
. J'ai également complètement réinstallé le node_modules
.
Essayez si vous obtenez un message d'erreur plus descriptif en exécutant le test depuis le terminal, comme ceci:
ng test -sm=false
Dans votre test, vous pouvez remplacer
it('should...')
avec
fit('should...')
Désormais, seuls les tests précédés de fit seront exécutés . Pour laisser le navigateur ouvert après l'exécution du test, exécutez le test comme suit:
ng test -sm=false --single-run false
Personnellement, j'ai rencontré cette erreur deux fois. Les deux n'ont été déclenchés que lors de l'appel de fixture.detectChanges ().
Le first time, je l’ai résolu en utilisant l’interpolation de chaîne de manière plus sûre dans mon fichier .html.
Dangereux exemple:
<p>{{user.firstName}}</p>
Safe (r) exemple (notez le point d'interrogation):
<p>{{user?.firstName}}</p>
La même chose peut s'appliquer à la liaison de propriété:
<p [innerText]="user?.firstName"></p>
La seconde heure, j’utilisais un DatePipe dans mon fichier .html, mais la propriété fictive sur laquelle je l’utilisais n’était pas une date.
fichier .html:
<p>{{startDate | date: 'dd-MM-yyyy'}}</p>
Fichier .ts (mock-data) ( faux ):
let startDate = 'blablah';
Fichier .ts (mock-data) ( correct ):
let startDate = '2018-01-26';
Cela est dû au fait que le framework jasmine ne peut pas gérer le type ErrorEvent. Il ne extrait donc pas le message d'erreur et appelle plutôt error.toString()
sur cet objet.
Je viens de déposer un problème à l'adresse jasmine repo https://github.com/jasmine/jasmine/issues/1594
Tant qu'il n'est pas corrigé, vous pouvez corriger temporairement votre paquet jasmine installé dans le dossier node_modules. Dans mon cas c'est
node_modules/jasmine/node_modules/lib/jasmine-core/jasmine.js
puis changez l'implémentation de ExceptionFormatter de cette
if (error.name && error.message) {
message += error.name + ': ' + error.message;
} else {
message += error.toString() + ' thrown';
}
pour ça
if (error.name && error.message) {
message += error.name + ': ' + error.message;
} else if (error.message) {
message += error.message;
} else {
message += error.toString() + ' thrown';
}
Cela aide à identifier le problème.
Pour moi, il était lié à la résolution d'une promesse dans la variable ngOnInit
d'un composant. Je devais utiliser async
, fakeAsync
et cocher ainsi que stubbing le service async avec spyOn
beforeEach(async(
//... initialise testbed and component
))
beforeEach(fakeAsync(
// ... setup mocks then call:
component.ngOnInit()
tick()
fixture.detectChanges()
))
Angulaire - Comment tester un composant avec appel de service asynchrone
TL; DR: il peut être lié au test de routage.
Je reçois aussi [object ErrorEvent] thrown
. Une heure plus tard, je l'ai tracé à une ligne de code.
this.username = this.userService.getUser(this.route.snapshot.paramMap.get('id'))[0];
Le problème réside dans l’environnement de test qui tente d’évaluer this.route.snapshot.paramMap.get('id')
.
Si je le remplace par 0
, [object ErrorEvent] thrown
disparaîtra.
Mon userService a un utilisateur comme suit:
public users = [ ["admin", "First name", "Surname", etc... ] ].
Donc, 0
obtient simplement cet utilisateur, à l’index 0
.
Sinon, lors de l'exécution normale de mon application, this.route.snapshot.paramMap.get('id')
est évalué lorsque l'utilisateur sélectionne un utilisateur à modifier à partir de ma table d'utilisateurs.
Donc, dans mon code HTML, *ngFor="let user of users; index as i"
boucle pour afficher tous les utilisateurs, puis routerLink="/edit/{{i}}"
afin que vous puissiez cliquer sur les boutons de modification de chaque utilisateur. http://localhost:4200/edit/0
pour modifier les détails de l'utilisateur admin susmentionné.
qu'en est-il du nettoyage après chaque cas de test:
afterEach(() => {
TestBed.resetTestingModule();
})
J'ai eu le même problème. Cette erreur se produit notamment lorsque vous essayez d'accéder à un élément null ou indéfini dans le modèle. Assurez-vous de vérifier la sécurité de ces variables.
Par exemple, cela lancera [object: ErrorEvent] lorsque la configuration n'est pas définie lors du chargement du composant.
template.html
<div *ngIf="config.options">
.....
......
</div>
Faites ceci à la place
<div *ngIf="config?.options">
.....
......
</div>
Ce qui peut vous aider, c’est que si vous ouvrez la fenêtre Chrome pour votre programme d’essai Karma, ouvrez les outils de développement et vérifiez la console à cet endroit. Pour moi, cela m'a aidé à découvrir que l'application ne pouvait pas utiliser la méthode Array.findIndex sur un tableau non défini (car la structure de données était organisée par une chaîne de date, telle que data [2018], [3] [28], et Il m'est arrivé de me faire indiquer la mauvaise date), mais pourtant, au lieu de simplement m'arrêter à l'erreur, le test a continué à s'exécuter.
Dans mon cas, le problème venait du service, car l’un des objets restait indéfini lors des tests en cours.
L'échantillon de code de service était quelque chose comme ci-dessous l'accès à dom,
const elem = this.document.querySelector(element) as HTMLElement;
elem.scrollIntoView({param1: ''});
Les spécifications faisant référence à ce service échouaient avec l'erreur ' [objet ErrorEvent] renvoyé '.
Je me suis moqué de mon objet de service dans toutes les spécifications qui faisaient référence à cela et le problème a été résolu.
Service de maquette
class MockService {
serviceMethod(div) : void {
testElement = document.querySelector('div') as HTMLElement;
return testElement;
}
}
Et utilisez cet objet de service fictif dans les fournisseurs comme ci-dessous,
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [Component],
providers: [
{ provide: Service, useClass: MockService },
],
})
.compileComponents();
}));
Pour moi, le problème était que j'avais un test en utilisant accidentellement la bibliothèque auth0-lock .
J'utilisais un proxy dans mon application défini dans proxy.conf.json comme:
'/api': { 'target': 'some path', 'changeOrigin': false }
Comme Karma n’était pas au courant de ce proxy, il a gardé des erreurs dans la console qui empêchaient de trouver le noeud final de l’API . "proxies" dans karma.conf.js avec le même objet du fichier proxy.conf.json:
proxies: { '/api': { 'target': 'some path', 'changeOrigin': false }}
L'erreur dans la console avait disparu et [objet errorEvent] n'était plus lancé.
[objet ErrorEvent] levé
Cette erreur montre que vous avez quelque chose d'indéfini. Le moyen le plus simple de le déboguer à partir de mon expérience est:
it('should create', () => {
console.log(component);
// You can check in the browser log which property is undefined
});
Cela semblait être un problème asynchrone, car après avoir ajouté suffisamment de it
s dans l'une de mes spécifications de composant, j'ai pu obtenir un message d'erreur utilisable qui indiquait un fichier et une ligne dans ce fichier (il était lié à paramMap
.
Dans la spécification qui a testé ParamMap, je viens d'ajouter:
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();
});
});
Vous pouvez avoir une course ou un test asynchrone qui n'est pas configuré correctement ou qui est utilisé de manière incorrecte. Je suppose que le cas de débogage doit être corrigé et ignore que la ligne de commande passe. Continuez simplement d’actualiser le programme d’exécution du test du karma (navigateur) au cas où l’erreur [object ErrorEvent] thrown
apparaît par intermittence, puis assurez-vous que vous avez correctement implémenté la condition async.
Espérons que cela fonctionne.