Scherz: mocking-Konsole.error - tests fehlschlägt

Das Problem:

Habe ich eine einfache Reagieren Komponente, die ich mit lernen, test-Komponenten, die mit Scherz und Enzym. Wie arbeite ich mit props, ich habe den prop-types Modul zu prüfen, für die Eigenschaften in der Entwicklung. prop-types verwendet console.error um zu warnen, wenn die obligatorische Requisiten, die nicht bestanden sind oder als Requisiten sind der falsche Datentyp.

Ich wollte mock console.error zu zählen, wie oft es hieß, von prop-types als ich an fehlende/mis-typed Requisiten.

Mit diesem vereinfachten Beispiel-Komponente und testen, würde ich erwarten, dass die beiden tests zu Verhalten, wie Z:

  1. Der erste test mit 0/2 erforderliche Requisiten fangen sollte der mock ruft zweimal.
  2. Der zweite test mit 1/2 erforderliche Requisiten fangen sollte das mock einmal aufgerufen.

Anstelle, bekomme ich diese:

  1. Der erste test verläuft erfolgreich.
  2. Der zweite test schlägt fehl, beschwert sich, dass die mock-Funktion aufgerufen wurde null mal.
  3. Wenn ich tausche die Reihenfolge der tests, die erste funktioniert und die zweite ausfällt.
  4. Wenn ich den split jeden test in eine einzelne Datei, die beide arbeiten.
  5. console.error Ausgabe unterdrückt, so ist es klar, es ist verspottet für beide.

Ich bin mir sicher, dass ich bin vermisste von etwas offensichtlichem, wie das clearing der mock falsch oder was auch immer.

Wenn ich die gleiche Struktur gegen ein Modul exportiert die Funktion, den Aufruf console.error einer beliebigen Anzahl von Zeiten, die Dinge funktionieren.

Es ist, wenn ich den test mit Enzym/reagieren, dass ich traf diese Wand nach dem ersten test.

Probe App.js:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

export default class App extends Component {

  render(){
    return(
      <div>Hello world.</div>
    );
  }
};

App.propTypes = {
  id : PropTypes.string.isRequired,
  data : PropTypes.object.isRequired
};

Probe App.test.js

import React from 'react';
import { mount } from 'enzyme';
import App from './App';

console.error = jest.fn();

beforeEach(() => {
  console.error.mockClear();
});

it('component logs two errors when no props are passed', () => {
  const wrapper = mount(<App />);
  expect(console.error).toHaveBeenCalledTimes(2);
});

it('component logs one error when only id is passed', () => {
  const wrapper = mount(<App id="stringofstuff"/>);
  expect(console.error).toHaveBeenCalledTimes(1);
});

Letzte Anmerkung: Ja, ist es besser zu schreiben der Komponente zu erzeugen benutzerfreundliche Ausgabe, wenn die Requisiten fehlen, dann testen Sie für, die. Aber einmal fand ich dieses Verhalten, wollte ich herausfinden, was ich falsch mache, als ein Weg, um zu verbessern mein Verständnis. Klar, ich bin etwas fehlt.

Schreibe einen Kommentar