2017-01-16 5 views
1

Ich bringe Tests zu unseren Javascript-Dateien an meinem Arbeitsplatz. Ich habe mich entschieden, Mocha, Chai und Sinon Bibliotheken zu benutzen, um beim Testen zu helfen. Ich fange an, Komponententests für Funktionen zu schreiben, die nicht zu viel Refactoring benötigen und bin in diesen interessanten Fall geraten, den ich nicht wirklich verstehe.Sinon Stub eine Funktion innerhalb einer Funktion

function getQueries() { 
    code that returns queries in an array -> ['one', 'two', 'three']  
} 

function sort(col, type) { 
    var queries = getQueries(); 
    some code that sorts these queries 
    return sorted array 
} 

Weil I-Einheit am Testen der Sortierfunktion Ich wollte getQueries Stub() eine Dummy Liste zurückzukehren.

var queries = ['one', 'two', 'three']; 
sinon.stub(getQueries).returns(queries); 

Der obige Code nicht funktioniert Fehler msg:

TypeError: Attempted to wrap undefined property undefined as function 
at Object.wrapMethod (file://node_modules/sinon/pkg/sinon-1.17.7.js:1359:29) 
at Object.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:3459:26) 
at F.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:4200:44) 
at Context.obj.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:4215:37) 
at Context.<anonymous> (unit_tests/unit_test.js:154:10) 
at Context.sinonSandboxedTest (file:/node_modules/sinon/pkg/sinon-1.17.7.js:6069:39) 

jedoch der folgende Code ordnungsgemäß funktionierte.

var queries = ['one', 'two', 'three']; 
getQueries = sinon.stub(); 
getQueries.returns(queries); 

Ich verstehe nicht ganz, warum dieser Code funktioniert, während die über es nicht der Fall ist. Ich kenne die Syntax von sinon.stub (obj, method, function), aber die getQueries ist eine Funktion ohne ein Objekt. Jede Einsicht wird sehr geschätzt.

Antwort

1

Wenn getQueries scheint kein Teil eines Objekts zu sein, ist es Teil des globalen Objekts window, so sinon.stub(window, 'getQueries', ...) sollte den Trick tun.

Ein wohl besserer Ansatz wäre in diesem Fall, das Ergebnis von getQueries an die Sortierfunktion zu übergeben. In Ihrer aktuellen Struktur hat die Funktion sort zwei Jobs: die Liste abrufen und sortieren. Sie könnten vielleicht mit der Benennung der Funktion getSortedQueries durchkommen, aber die tatsächliche separation of concerns ist sogar noch besser, und Sie würden nicht einmal brauchen, um die Funktion zu verspotten oder zu stubben, weil Sie einfach eine feste Liste an die Sortierfunktion übergeben können.

+0

Super! Ich habe versucht, Dokument als mein globales Objekt zu verwenden, aber ich schätze sein Fenster. Danke für die Antwort. –

Verwandte Themen