2017-01-27 44 views
13

muszę przetestować funkcję, która otwiera nową kartę w przeglądarceJak wyśmiać obiekt okna JavaScript za pomocą Jest?

openStatementsReport(contactIds) { 
    window.open(`a_url_${contactIds}`); 
    } 

chciałbym mock otwartą funkcję okna, więc mogę zweryfikować prawidłowe URL jest przekazywana do otwartych funkcji.

Używanie Jest, nie wiem, jak kpić z okna. Próbowałem ustawić window.open z fałszywą funkcją, ale ta metoda nie działa. Poniżej znajduje się sprawdzian

it('correct url is called',() => { 
    window.open = jest.fn(); 
    statementService.openStatementsReport(111); 
    expect(window.open).toBeCalled(); 
}); 

ale daje mi błąd

expect(jest.fn())[.not].toBeCalled() 

    jest.fn() value must be a mock function or spy. 
    Received: 
     function: [Function anonymous] 

Co należy zrobić w przypadku testu? Wszelkie sugestie lub wskazówki są doceniane

Odpowiedz

7

Zamiast window użycie global

it('correct url is called',() => { 
    global.open = jest.fn(); 
    statementService.openStatementsReport(111); 
    expect(global.open).toBeCalled(); 
}); 

można także spróbować

const open = jest.fn() 
Object.defineProperty(window, 'open', open); 
+1

próbowałem, ale nie pracuje mnie. Mój przypadek jest dziwny, kpiny działają lokalnie, ale nie na połączenie PR w Travis ... jakiś pomysł? –

+2

wciąż ten sam błąd. – danny

+0

@AlexJM czy masz ten sam problem? Umysł podzielić się tym, jak wyśmiewasz obiekt okna? – danny

0

Można spróbować to:

import * as _Window from "jsdom/lib/jsdom/browser/Window"; 

window.open = jest.fn().mockImplementationOnce(() => { 
    return new _Window({ parsingMode: "html" }); 
}); 

it("correct url is called",() => { 
    statementService.openStatementsReport(111); 
    expect(window.open).toHaveBeenCalled(); 
});