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:
- Der erste test mit 0/2 erforderliche Requisiten fangen sollte der mock ruft zweimal.
- Der zweite test mit 1/2 erforderliche Requisiten fangen sollte das mock einmal aufgerufen.
Anstelle, bekomme ich diese:
- Der erste test verläuft erfolgreich.
- Der zweite test schlägt fehl, beschwert sich, dass die mock-Funktion aufgerufen wurde null mal.
- Wenn ich tausche die Reihenfolge der tests, die erste funktioniert und die zweite ausfällt.
- Wenn ich den split jeden test in eine einzelne Datei, die beide arbeiten.
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nichts vermissen. Es ist ein bekanntes Problem (https://github.com/facebook/react/issues/7047) über fehlende Fehler/Warnmeldungen.
Wenn Sie schalten Sie Ihr test-Fällen ("...wenn nur die id übergeben' - der ersten, "...wenn keine Requisiten bestanden " - die zweite), und solche
console.log('mockedError', console.error.mock.calls);
in Ihrem test Fällen können Sie sehen, dass die Nachricht über fehlende id nicht ausgelöst, im zweiten test.Ich lief in ein ähnliches problem, musste nur den cache der ursprünglichen Methode
console.error.mockRestore()
Gegeben, die das Verhalten erklärt durch @DLyman, Sie könnte es tun, wie:
Was die Jungs oben geschrieben haben, ist korrekt. Ich habe encoutered ähnliches problem und hier meine Lösung. Es dauert auch Berücksichtigung der situation, wenn man dabei einige assertion auf die verspottet Objekt:
Für meine Lösungen ich bin nur Verpackung original Konsole und kombinieren Sie alle Nachrichten, die in arrays. Kann jemand sein, den es benötigt.