Jest: Lassen Sie zu, dass console.error/warn/log in Tests überschrieben wird

Erstellt am 31. März 2017  ·  3Kommentare  ·  Quelle: facebook/jest


Möchten Sie eine Funktion anfordern oder einen Fehler melden?
Merkmal

Wie ist das aktuelle Verhalten?
Aufgrund von BufferedConsole ist es unmöglich, console.error , console.log , console.warn und console.info zu überschreiben.

Anwendungsfall: Wir möchten, dass console.error und console.warn Fehler auslösen und Tests nicht bestehen.

Wenn das aktuelle Verhalten ein Fehler ist, stellen Sie bitte die zu reproduzierenden Schritte und entweder eine repl.it-Demo über https://repl.it/languages/jest oder ein minimales Repository auf GitHub bereit, das wir yarn install und yarn test .

Was ist das erwartete Verhalten?
Ich erwarte, dass, wenn ich console.error = (message) => { throw new Error(message); }; (global, in einem Test oder in setupFiles/setupFramework) hinzufüge, dass jedes Mal, wenn console.error in einem Test aufgerufen wird, ein Fehler ausgegeben wird und ein Test fehlschlägt.

In Wirklichkeit passiert nichts.

Bitte geben Sie Ihre genaue Jest-Konfiguration an und erwähnen Sie Ihre Jest-, Node-, Garn-/npm-Version und Ihr Betriebssystem.

N / A

Hilfreichster Kommentar

Spottfunktion verwenden jest.fn() :

console.warn = jest.fn(warn => {
  throw new Error(warn);
});

Alle 3 Kommentare

Spottfunktion verwenden jest.fn() :

console.warn = jest.fn(warn => {
  throw new Error(warn);
});

@thymikee Dies funktioniert auch nicht wie erwartet, wenn eine globale Setup-Datei verwendet wird:

in "setupTestFrameworkScriptFile": "<rootDir>/tools/jest/setup-framework.js"

beforeEach(() => {
  console.error = jest.fn((error) => {
    throw new Error(error);
  });
});

Im Test:

const somePromiseThatLogsConsoleError = () => {
  return new Promise((resolve, reject) => {
    console.error('foobar');
    resolve();
  });
});

it('test that has console.error', () => {
  return somePromiseThatLogsConsoleError().then(() => {
    expect(false).toBeTrue();
  });
});

Ich habe es gerade ausprobiert und es hat funktioniert:

// test file
test('lol', () => {
  return new Promise((resolve) => {
    console.log('lol');
    resolve();
  });
});
// setup file
global.console.log = () => {
  throw new Error('hey!');
};

Ergebnis:

 __tests__/test-test.js
  ✕ lol (3ms)

  ● lol

    hey!

      at CustomConsole.Object.<anonymous>.global.console.log (setup.js:2:9)
      at resolve (__tests__/test-test.js:3:13)
      at Object.<anonymous>.test (__tests__/test-test.js:2:10)
      at process._tickCallback (internal/process/next_tick.js:109:7)

Test Summary
 › Ran all tests.
 › 1 test failed, 0 tests passed (1 total in 1 test suite, run time 0.661s)
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen