2017-09-12 1 views
1

Anwendungscode ruft location.href = "some-url" an. Ich möchte einen Test schreiben, der die Navigationsumleitung überprüft hat.Abfangen der Navigationsänderung mit jest.js (oder Vorgehensweise zum Überschreiben und Wiederherstellen von location.href)

Mit Jest auf Jsdom, versuchte ich es mit override location.href Setter mit Jest Mock-Funktion und es funktioniert.

Aber jetzt kann ich nicht die location.href -Eigenschaft bei der Test-Bereinigung wiederherstellen, und es fehlgeschlagen den Rest der Tests, die auf "location.href" weiterleiten.

it('test navigation happened',() => { 
    const originalLocationHref = Object.getOwnPropertyDescriptor(window.location, 'href'); // returns undefined 

    spyFn = jest.fn(); 
    Object.defineProperty(window.location, 'href', { 
    set: spyFn, 
    enumerable: true, 
    configurable: true 
    }); 

    someAppCodeThatShouldRedirectToSomeUrl(); 

    expect(spyFn).toBeCalledWith('http://some-url'); // this is working 

    // Cleanup code, not working, because originalLocationHref is undefined 
    Object.defineProperty(window.location, 'href', originalLocationHref); 
}); 

Was fehlt mir? Warum Object.getOwnPropertyDescriptor(window.location, 'href'); ist undefined?

Gibt es eine bessere Möglichkeit, Navigationsereignisse abzufangen, um sie zu testen?

Dank

Antwort

4

Verwenden location.assign() Methode anstelle anstelle neuen Standort Zeichenfolge zuzuweisen location.href. Dann können Sie es ohne Probleme simulieren und testen:

it('test navigation happened',() => { 
    window.location.assign = jest.fn(); 

    // here you call location.assign('http://some-url'); 
    someAppCodeThatShouldRedirectToSomeUrl(); 

    expect(window.location.assign).toBeCalledWith('http://some-url'); 

    // location.href hasn't changed because location.assign was mocked 
}); 
Verwandte Themen