2016-07-08 24 views
3

Ich habe eine Funktion:Mit SinonJS Stutzen (mit rewire)

var publish = function(a, b, c) { 
    main = a + getWriterName(b,c); 
} 

und getWriterName ist eine weitere Funktion:

var getWriterName = function(b,c) { 
    return 'Hello World'; 
} 

Ich möchte die „veröffentlichen“ Funktion testen, aber ich will nicht Führen Sie die Funktion "getWriterName" aus, während ich "publish" teste. Ich habe das Gefühl, dass ich die Funktion getWriterName stub, weil ich sie nicht jedes Mal ausführen möchte, wenn ich "publish" teste, aber wie mache ich das? Ich habe so etwas wie:

var sandbox = sinon.sandbox.create(); 
sandbox.stub(getWriterName).returns('done'); 

Aber das gibt mir einen Fehler von

TypeError: Attempted to wrap undefined property undefined as function

Was mit meinem Anstoßen falsch ist, wenn ich in dem Schreibpfad bin?

Edit: ich mit so bin rewire Lösungen möchte

mit rewire

Antwort

0

Das ist mein Problem gelöst:

Wenn meine Funktionen in einer Datei sind aufgerufen main.js dann zuerst verdrahte ich die Akte als:

Dann, um jede andere Funktion zu stubben, die hereingerufen wird eine Funktion, in meinem Fall, wenn ich getWriterName Stummel musste ich tun würde:

main.__set__('getWriterName', function(b, c) { 
    return 'Something Else' 
} 

und schließlich, nachdem es mit Fertigstellung tun

main.restore(); 
0

Von sinon docs: „Die sinon.sandbox.create(config) Methode ist vor allem eine Integrationsfunktion und als Endverwender Sinon.JS werden Sie wahrscheinlich nicht brauchen es."

Normalerweise erstellen Sie eine sinon Stummel mit der Syntax:

sinon.stub(obj, 'property, function(){ 
     //do something 
} 

Lassen Sie uns sagen, dass irgendwo in der Datei, die Sie diese beiden Funktionen exportieren

//somefile.js 
var publish = function(a, b, c) { 
    main = a + getWriterName(b,c); 
} 

var getWriterName = function(b,c) { 
    return 'Hello World'; 
} 
exports.getWriterName = getWriterName; 
exports.publish = publish; 

sie in Ihren Tests importieren:

var someFile = require('./somefile.js'); 

Und versuchen, die Methode auszugeben, die Sie möchten:

sinon.stub(someFile, 'getWriterName', function(b, c) { 
    return 'done' 
}); 

Sie werden feststellen, dass dies auch nicht funktioniert. Dies liegt daran, dass sinon eine Methode, die erforderlich ist, nicht ausstoßen kann, es sei denn, sie kann als Eigenschaft der von Ihnen benötigten Datei darauf zugreifen. Damit dies funktioniert, müssen Sie dies zu tun:

//somefile.js

var getWriterName = function(b,c) { 
    return 'Hello World'; 
} 
exports.getWriterName = getWriterName; 

var publish = function(a, b, c) { 
    main = a + exports.getWriterName(b,c); 
} 
exports.publish = publish; 

die getWriterName Jetzt ist zugänglich für Anstoßen aus, wenn Sie die Datei mit den Funktionen Import in Ihre Tests.Sie würden es tun, wie das obige Beispiel:

sinon.stub(someFile, 'getWriterName', function(b, c) { 
    return 'done' 
}); 

Und kann es rückgängig machen mit:

someFile.getWriterName.restore(); 
+0

Es tut mir leid, ich wollte eine Lösung mit rewire anstatt erfordern –

1

Dies ist, wie Sinon mit Rewire verwendet werden, um Stub eine Funktion. Rewire in diesem Fall ist besonders nützlich, wenn die Stub-Funktion privat ist.