Es gibt hier zwar die gleiche Frage, aber ich konnte keine Antwort auf mein Problem finden. Hier ist meine Frage:
Ich teste meine Node JS App mit Mokka und Chai. Ich benutze Sinion, um meine Funktion zu verpacken.
describe('App Functions', function(){
let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
//some stuff
});
it('get results',function(done) {
testApp.someFun
});
}
describe('App Errors', function(){
let mockObj = sinon.stub(testApp, 'getObj', (dbUrl) => {
//some stuff
});
it('throws errors',function(done) {
testApp.someFun
});
}
Wenn ich versuche, diesen Test auszuführen, wird mir ein Fehler angezeigt
Attempted to wrap getObj which is already wrapped
Ich habe auch versucht zu setzen
beforeEach(function () {
sandbox = sinon.sandbox.create();
});
afterEach(function () {
sandbox.restore();
});
in jedem beschreiben, aber immer noch den gleichen Fehler geben.
Antworten:
Sie sollten die
getObj
In-after()
Funktion wiederherstellen . Bitte versuchen Sie es wie folgt.quelle
sinon.restoreAll();
, die nach allen Tests ausgeführt werden könnte, nur um sicherzustellen, dass Sie nicht vergessen, einen Stub wiederherzustellen.Dieser Fehler ist darauf zurückzuführen, dass die Stub-Funktion nicht ordnungsgemäß wiederhergestellt wurde. Verwenden Sie die Sandbox und erstellen Sie den Stub mithilfe der Sandbox. Stellen Sie nach jedem Test in der Suite die Sandbox wieder her
quelle
In Fällen, in denen Sie alle Methoden eines Objekts wiederherstellen müssen, können Sie die verwenden
sinon.restore(obj)
.Beispiel:
quelle
// Previously sinon.restore(stubObject); // Typescript (stubObject as any).restore(); // Javascript stubObject.restore();
Ich habe dies auch mit den before () und after () Hooks von Mocha getroffen. Ich habe auch das restore () verwendet, wie überall erwähnt. Eine einzelne Testdatei lief einwandfrei, mehrere nicht. Endlich über Mokka Root-Level-Hooks gefunden : Ich hatte mein Vorher () und Nachher () nicht in meinem eigenen beschreiben (). Es findet also alle Dateien mit before () auf Stammebene und führt diese aus, bevor Tests gestartet werden.
Stellen Sie also sicher, dass Sie ein ähnliches Muster haben:
quelle
Es wird empfohlen, Stubs in 'beforeEach' zu initialisieren und in 'afterEach' wiederherzustellen. Wenn Sie sich jedoch abenteuerlustig fühlen, funktioniert auch Folgendes.
quelle
Selbst mit Sandbox könnte es Ihnen den Fehler geben. Insbesondere, wenn Tests für ES6-Klassen parallel ausgeführt werden.
Dies könnte den gleichen Fehler auslösen, wenn ein anderer Test versucht, myFunc vom Prototyp zu entfernen. Ich konnte das beheben, bin aber nicht stolz darauf ...
quelle
Für alle, die auf dieses Problem stoßen, wenn Sie das gesamte Objekt stummeln oder ausspionieren und dies später tun
Sie werden immer noch den Fehler erhalten. Sie müssen die einzelnen Methoden stub / spy.
Ich habe für immer versucht herauszufinden, was los war.
sinon-7.5.0
quelle
Ich bin mit Spionen darauf gestoßen. Dieses Verhalten macht es ziemlich unflexibel, mit Sinon zu arbeiten. Ich habe eine Hilfsfunktion erstellt, die versucht, vorhandene Spione zu entfernen, bevor neue festgelegt werden. Auf diese Weise muss ich mir keine Sorgen um einen Vorher / Nachher-Zustand machen. Ein ähnlicher Ansatz könnte auch für Stubs funktionieren.
quelle