it-swarm.com.de

Scherz. Wie verspotte ich eine Konsole, wenn sie von einer Drittanbieter-Bibliothek verwendet wird?

Ich versuche, console.warn/error zu verspotten, aber ich kann nicht. Ich benutze eine Third-Party-Library, die console.warn aufruft. Ich muss testen, ob es heißt oder nicht. In meinem Testfall habe ich versucht, console.warn zu stoppen, aber es hat nicht geholfen. Danach habe ich versucht, Konsole manuell zu verspotten, es hat auch nicht geklappt.

console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
expect(console.warn).toBeCalled();

hat nicht funktioniert

console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
console.warn('error');
expect(console.warn).toBeCalled();

funktionierte. Aber ich sehe immer noch console.warn node_modules/babel-relay-plugin/lib/getBabelRelayPlugin.js:138 im Terminal. Kann mir jemand helfen?

44
Errorpro

Sie müssen global verwenden, um auf Objekte im globalen Kontext zuzugreifen

global.console = {warn: jest.fn()}
expect(console.warn).toBeCalled()

oder benutze jest.spyOn hinzugefügt in 19.0.0

jest.spyOn(global.console, 'warn')
89

Verwenden Sie jest.spyOn() und spy.mockRestore().

const spy = jest.spyOn(console, 'warn').mockImplementation();
...
spy.mockRestore();

Die akzeptierte Antwort stellt das ursprüngliche console.warn() nicht wieder her und gefährdet Ihre anderen Tests in derselben Datei (wenn sie auch console.warn() verwenden).

Wenn Sie console.warn = jest.fn() in einer Testdatei verwenden, hat dies keine Auswirkungen auf andere Testdateien (console.warn wird auf den ursprünglichen Wert zurückgesetzt).

Hinweis: Rufen Sie am besten spy.mockRestore() inside afterEach()/afterAll() auf, damit Sie sicher sind, dass ein Test, der abstürzt, auch die anderen nicht beeinträchtigt file => stellt sicher, dass Ihre Tests in derselben Datei vollständig isoliert sind.

Vollständiges Beispiel:

const spy = jest.spyOn(console, 'warn').mockImplementation();
console.warn('message1'); // Won't be displayed (mocked)
console.warn('message2'); // Won't be displayed (mocked)
expect(console.warn).toHaveBeenCalledTimes(2);
expect(spy).toHaveBeenCalledTimes(2); // Another syntax
expect(console.warn).toHaveBeenLastCalledWith('message2');
expect(spy).toHaveBeenLastCalledWith('message2'); // Another syntax
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);
spy.mockRestore(); // IMPORTANT
//console.warn.mockRestore(); // Another syntax

console.warn('message3'); // Will be displayed (not mocked anymore)
expect(spy).toHaveBeenCalledTimes(0); // Not counting anymore
expect(spy.mock.calls).toEqual([]);
//expect(console.warn.mock.calls).toEqual([]); // Crash

Sie können console.warn = jest.fn().mockImplementation() [...] console.warn.mockRestore() nicht schreiben, da die ursprüngliche console.warn() nicht wiederhergestellt wird.

/!\Mit mockImplementationOnce() müssen Sie noch spy.mockRestore() aufrufen:

// /!\
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
console.warn('message1'); // Won't be displayed (mocked)
expect(console.warn).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledTimes(1); // Another syntax
expect(console.warn).toHaveBeenLastCalledWith('message1');
expect(spy).toHaveBeenLastCalledWith('message1'); // Another syntax
expect(spy.mock.calls).toEqual([['message1']]);
expect(console.warn.mock.calls).toEqual([['message1']]);

console.warn('message2'); // Will be displayed (not mocked anymore)
// /!\
expect(console.warn).toHaveBeenCalledTimes(2); // BAD => still counting
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);

spy.mockRestore(); // IMPORTANT
//console.warn.mockRestore(); // Another syntax
console.warn('message3'); // Will be displayed (not mocked anymore)
expect(spy).toHaveBeenCalledTimes(0); // Not counting anymore
expect(spy.mock.calls).toEqual([]);
//expect(console.warn.mock.calls).toEqual([]); // Crash

Sie können auch schreiben:

const assert = console.assert;
console.assert = jest.fn();
...
console.assert = assert;
9
tanguy_k