wake-up-neo.com

Wie debugge ich einen Fehler "[object ErrorEvent] geworfen" in meinen Karma/Jasmin-Tests?

Ich habe mehrere fehlgeschlagene Tests, die nur [object ErrorEvent] thrown ausgeben. Ich sehe in der Konsole nichts, was mir hilft, den anstößigen Code herauszufinden. Gibt es etwas, das ich tun muss, um diese aufzuspüren?

[EDIT]: Ich verwende Karma v1.70, Jasmine v2.7.0

88
Darrell Brogdon

Um dies zu beheben, müssen Sie Ihre Tests ohne Sourcemaps als Workaround ausführen:

CLI v6.0.8 und höher
--source-map=false

CLI v6.0.x frühe Versionen
--sourceMap=false

CLI v1.x
--sourcemaps=false

Abkürzung ng test -sm=false könnte auch funktionieren

Es gibt ein offenes Problem zu diesem Thema https://github.com/angular/angular-cli/issues/7296

[~ # ~] Update [~ # ~] : Ich hatte auch dieses Problem, also bin ich einfach auf die neueste CLI umgestiegen und habe dafür gesorgt, dass alle Pakete werden aktualisiert in package.json Ich habe auch das node_modules also jetzt ist das problem weg.

114
Kuncevič

Wenn sourcemap = false nicht hilft, versuchen Sie 1) Öffnen Sie Ihren Browser und führen Sie die Tests aus 2) Klicken Sie auf die Debug-Schaltfläche 3) Öffnen Sie die Konsole

Der Fehler wird da sein

 enter image description here

37
Victor Bredihin

Versuchen Sie es, wenn Sie eine aussagekräftigere Fehlermeldung erhalten, indem Sie den Test wie folgt auf dem Terminal ausführen:

ng test -sm=false

In Ihrem Test können Sie ersetzen 

it('should...')

mit 

fit('should...') 

Jetzt werden nur Tests ausgeführt, denen fit vorangeht .. Um den Browser nach dem Test geöffnet zu lassen, führen Sie den Test folgendermaßen aus: 

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

Ich persönlich bin diesem Fehler zweimal begegnet. Beide wurden nur beim Aufruf von fixture.detectChanges () ausgelöst.

Die first - Zeit löste ich durch die sicherere Verwendung der Zeichenfolgeninterpolation in meiner .html-Datei.

Unsicheres Beispiel:

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

Safe (r) Beispiel (Beachten Sie das Fragezeichen):

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

Dasselbe kann für die Eigentumsbindung gelten:

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

Zum Zeitpunkt Sekunde habe ich ein DatePipe in meiner HTML-Datei verwendet, aber die Mock-Eigenschaft, mit der ich es verwendet habe, war kein Datum.

.html-Datei:

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

.ts-Datei (Scheindaten) (falsch):

let startDate = 'blablah';

.ts-Datei (Scheindaten) (correct):

let startDate = '2018-01-26';
22
harryvederci

Dies liegt daran, dass das Jasmin-Framework den ErrorEvent-Typ nicht verarbeiten kann, so dass die Fehlermeldung nicht extrahiert wird und stattdessen error.toString() für dieses Objekt aufgerufen wird.

Ich habe gerade ein Problem bei Jasmin Repo eingereicht https://github.com/jasmine/jasmine/issues/1594

Solange es nicht behoben ist, können Sie Ihr installiertes Jasmin-Paket vorübergehend im Ordner node_modules patchen. In meinem Fall ist es so 

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

und ändern Sie dann die Implementierung des ExceptionFormatter

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

zu diesem

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

Es hilft, das Problem zu identifizieren.

11
Ginie

Für mich ging es darum, dass ein Versprechen im ngOnInit einer Komponente gelöst wurde. Ich musste async, fakeAsync und tick verwenden sowie den async-Dienst mit spyOn auslöschen.

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

Angular - Einheitentestkomponente mit asynchronem Serviceaufruf

6
roo2

TL; DR: Kann mit dem Testen von Routing zusammenhängen.

Ich bekomme [object ErrorEvent] thrown auch . Eine Stunde später verfolgte ich es in einer Codezeile.

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

Das Problem liegt darin, dass die Testumgebung versucht, this.route.snapshot.paramMap.get('id') auszuwerten.

Wenn ich es durch 0 ersetze, geht [object ErrorEvent] thrown weg.

Mein userService hat so einen Benutzer:

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

Also bekommt 0 diesen Benutzer einfach an Index 0.

Andernfalls wird this.route.snapshot.paramMap.get('id') ausgewertet, wenn der Benutzer normalerweise einen Benutzer zum Bearbeiten aus meiner Benutzertabelle auswählt.

Daher zeigt *ngFor="let user of users; index as i" in meinem HTML-Code alle Benutzer an, dann routerLink="/edit/{{i}}", sodass Sie für jeden Benutzer auf die Bearbeitungsschaltflächen klicken können. http://localhost:4200/edit/0, um die zuvor genannten Admin-Benutzerdaten zu bearbeiten.

4
Leo

was ist mit der Reinigung nach jedem Testfall?

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

Ich hatte das gleiche Problem. Dieser Fehler tritt unter anderem auf, wenn Sie versuchen, auf null oder undefinierte Werte in der Vorlage zuzugreifen. Stellen Sie sicher, dass Sie eine Sicherheitsüberprüfung für diese Variable haben.

Zum Beispiel wird dies [object: ErrorEvent] auslösen, wenn config beim Laden der Komponente nicht definiert ist.

template.html

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

Tun Sie das stattdessen

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

Was helfen kann, ist, wenn Sie das Chrome-Fenster für Ihren Karma-Testläufer geöffnet haben, die Entwickler-Tools zu öffnen und die Konsole dort zu überprüfen. Dies half mir dabei herauszufinden, dass die App die Array.findIndex-Methode nicht für ein undefiniertes Array verwenden konnte (weil die Datenstruktur durch eine Datumszeichenfolge wie data [2018] [3] [28] und Ich habe zufällig auf ein falsches Datum hingewiesen), aber anstatt den Fehler einfach anzuhalten, lief der Test weiter.

0
OzzyTheGiant

In meinem Fall lag das Problem beim Dienst, da eines der Objekte während des Testlaufs undefiniert wird. 

Servicecode-Beispiel war so ähnlich wie unter dem Zugriff auf dom,

  const elem = this.document.querySelector(element) as HTMLElement;
  elem.scrollIntoView({param1: ''});

Die Angaben, die sich auf diesen Dienst beziehen, schlugen mit dem Fehler ' [object ErrorEvent] geworfen ' fehl.

Ich verspottete mein Serviceobjekt in allen Spezifikationen, die sich darauf bezogen hatten, und das Problem wurde gelöst.

Schein-Service

class MockService {
serviceMethod(div) : void {
  testElement = document.querySelector('div') as HTMLElement;
  return testElement;
  } 
}

Und verwenden Sie dieses Mock-Serviceobjekt in Anbietern wie folgt:

beforeEach(async(() => {

TestBed.configureTestingModule({
  declarations: [Component],
  providers: [
     { provide: Service, useClass: MockService },
    ],
})
  .compileComponents();
}));
0
Vishwa G

Für mich bestand das Problem darin, dass ich einen Test hatte, bei dem ich versehentlich die Bibliothek auth0-lock verwendet habe.

0
Manolis

Ich habe in meiner in proxy.conf.json definierten Anwendung einen Proxy verwendet:

'/api': { 'target': 'some path', 'changeOrigin': false }

Da Karma diesen Proxy nicht kannte, gab er immer wieder Fehler in der Konsole aus, dass der API-Endpunkt nicht gefunden werden konnte .. Nachdem ich in der Karma-Dokumentation nachgesehen hatte, stellte ich fest, dass ich die Option " Eigenschaft "proxies" in karma.conf.js mit demselben Objekt aus dem Proxy.conf.json:

proxies: { '/api': { 'target': 'some path', 'changeOrigin': false }}

Der Fehler in der Konsole war nicht mehr vorhanden und das [object errorEvent] wurde nicht mehr ausgelöst.

0
Arnold Layne

[object ErrorEvent] wurde ausgelöst

Dieser Fehler zeigt an, dass Sie etwas undefiniert haben. Der einfachste Weg, es von meiner Erfahrung aus zu debuggen, ist: 

it('should create', () => {
    console.log(component);
    // You can check in the browser log which property is undefined
    });
0
Daniel Dimitrov

Es schien ein asynchrones Problem zu sein, da ich, nachdem ich genügend its in einer meiner Komponentenspezifikationen hinzugefügt hatte, eine verwendbare Fehlermeldung erhalten konnte, die auf eine Datei und eine Zeile in dieser Datei verwies (sie hatte mit paramMap zu tun).

In der Spezifikation, die ParamMap getestet hat, habe ich gerade Folgendes hinzugefügt:

  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();
    });
  });
0
inorganik

Möglicherweise haben Sie einen Wettkampf oder einen asynchronen Test, der nicht richtig eingestellt ist oder falsch verwendet wird. Ich würde davon ausgehen, dass der Debug-Fall behoben werden muss und ignorieren, dass die Befehlszeile übergeben wird. Aktualisieren Sie einfach den Karma-Testläufer (Browser), falls der Fehler [object ErrorEvent] thrown gelegentlich angezeigt wird. Stellen Sie dann sicher, dass Sie die Async-Bedingung korrekt implementiert haben.

Hoffentlich klappt das.