Ich habe das folgende Modul, das ich in Jest testen möchte:
// myModule.js
export function otherFn() {
console.log('do something');
}
export function testFn() {
otherFn();
// do other things
}
Wie oben gezeigt, werden einige benannte Funktionen exportiert und vor allem testFn
verwendet otherFn
.
Wenn ich im Scherz meinen Komponententest für schreibe testFn
, möchte ich die otherFn
Funktion verspotten , da ich nicht möchte, dass Fehler otherFn
meinen Komponententest beeinflussen testFn
. Mein Problem ist, dass ich nicht sicher bin, wie ich das am besten machen kann:
// myModule.test.js
jest.unmock('myModule');
import { testFn, otherFn } from 'myModule';
describe('test category', () => {
it('tests something about testFn', () => {
// I want to mock "otherFn" here but can't reassign
// a.k.a. can't do otherFn = jest.fn()
});
});
Jede Hilfe / Einsicht wird geschätzt.
unit-testing
ecmascript-6
jestjs
Jon Rubins
quelle
quelle
otherFn
in ein separates Modul extrahieren und das verspotten.function A
wem anruft,function B
aber ich möchte nicht die eigentliche Implementierung von ausführen,function B
weil ich nur die infunction A
@testing-library/react
alle Leser da draußen sehr), aber ich weiß, dass dies ein umstrittenes Thema ist.Antworten:
Einsatz im
jest.requireActual()
Innernjest.mock()
Beispiel
Ich bevorzuge diese prägnante Verwendung, wenn Sie sie benötigen und innerhalb des zurückgegebenen Objekts verbreiten:
Auf diese Methode wird auch in der Dokumentation zu Jest's Manual Mocks (gegen Ende der Beispiele ) verwiesen :
quelle
return
Anweisung entfernen und den Pfeilfunktionskörper in Klammern setzen: z.jest.mock('./myModule', () => ({ ...jest.requireActual('./myModule'), otherFn: () => {}}))
...jest.requireActual
hat bei mir nicht richtig funktioniert, weil ich Pfad-Aliasing mit babel habe. Funktioniert entweder mit...require.requireActual
oder nach dem Entfernen des Aliasing vom PfadFunktioniert bei mir nicht, ich habe verwendet:
quelle
clearkMocks: true
jest package.json config festlegen. facebook.github.io/jest/docs/en/mock-function-api.htmlSieht so aus, als wäre ich zu spät zu dieser Party, aber ja, das ist möglich.
testFn
muss nurotherFn
mit dem Modul anrufen .Wenn
testFn
das Modul zum Aufrufen verwendetotherFn
wird, kann der Modulexport fürotherFn
verspottet werden undtestFn
ruft den Mock auf.Hier ist ein Arbeitsbeispiel:
myModule.js
myModule.test.js
quelle
exports.otherFn()
exports
existiert in ES6 nicht. Das Aufrufenexports.otherFn()
funktioniert derzeit, da ES6 mit einer früheren Modulsyntax kompiliert wird. Es wird jedoch unterbrochen, wenn ES6 nativ unterstützt wird.Mit dem transpilierten Code kann babel die Bindung,
otherFn()
auf die verwiesen wird, nicht abrufen . Wenn Sie eine Funktionsexpression verwenden, sollten Sie in der Lage sein, eine Verspottung zu erreichenotherFn()
.Aber wie @kentcdodds im vorherigen Kommentar erwähnt, möchten Sie wahrscheinlich nicht verspotten
otherFn()
. Schreiben Sie einfach eine neue Spezifikation fürotherFn()
und verspotten Sie alle erforderlichen Anrufe.Wenn Sie
otherFn()
beispielsweise eine http-Anfrage stellen ...Hier möchten Sie
http.get
Ihre Behauptungen basierend auf Ihren verspotteten Implementierungen verspotten und aktualisieren.quelle
otherFn
ist, werden alle Tests, die von diesem abhängen, nicht bestanden. Auch wennotherFn
5 ifs enthalten sind, müssen Sie möglicherweise testen, ob IhrtestFn
für alle diese Unterfälle gut funktioniert. Sie müssen jetzt so viele weitere Codepfade testen.Ich weiß, dass dies vor langer Zeit gefragt wurde, aber ich bin gerade in diese Situation geraten und habe endlich eine Lösung gefunden, die funktionieren würde. Also dachte ich, ich würde hier teilen.
Für das Modul:
Sie können Folgendes ändern:
Exportieren sie als Konstanten anstelle von Funktionen. Ich glaube, das Problem hat mit dem Heben in JavaScript zu tun und die Verwendung
const
verhindert dieses Verhalten.Dann können Sie in Ihrem Test so etwas wie das Folgende haben:
Ihre Mocks sollten jetzt so funktionieren, wie Sie es normalerweise erwarten würden.
quelle
Ich habe mein Problem mit einer Mischung der Antworten gelöst, die ich hier gefunden habe:
myModule.js
myModule.test.js
quelle
Zusätzlich zur ersten Antwort hier können Sie babel-plugin-rewire verwenden , um auch importierte benannte Funktionen zu verspotten. Sie können den Abschnitt oberflächlich auf die Neuverdrahtung benannter Funktionen überprüfen .
Einer der unmittelbaren Vorteile für Ihre Situation besteht darin, dass Sie nicht ändern müssen, wie Sie die andere Funktion von Ihrer Funktion aus aufrufen.
quelle