2014-12-13 4 views
5

Entschuldigung, wenn das eine einfache Frage ist, bin ich relativ neu bei Node und Sinon. Ich habe Mühe, herauszufinden, wie man behauptet, dass eine verschachtelte asynchrone Funktion in Nodejs aufgerufen wurde.Sinon - wie verschachtelte Funktion stub?

Ich benutze Mokka, Chai, Sinon und Anfrage (https://github.com/request/request) aber denke, dass ich etwas Grundlegendes auf dem Stubbing Teil vermisse.

Beispiel innerhalb my_app.js -

var request = require('request'); 

function MyModule() { 
}; 

MyModule.prototype.getTicker = function(callback) { 
    request('http://example.com/api/ticker', function(error, response) { 
     if (error) { 
      callback(error); 
     } else { 
      callback(null, response); 
     } 
    }); 
}; 

exports.mymodule = new MyModule(); 

Innerhalb des Tests. Ich versuche, den Aufruf zur Anforderung auszugeben und einige Dummy-Daten zur Verfügung zu stellen. Aber ich halte einen Fehler bekommen „Anforderung ist nicht definiert“ auf der Linie, wo ich "m den Stummel zu schaffen.

var myApp = require('../my_app.js') 
    ,assert = require("assert") 
    ,chai = require('chai') 
    ,sinon = require('sinon') 
    ,expect = chai.expect; 

describe('mymodule object', function() { 

    var mymodule = myApp.mymodule; 

    before(function(done) { 
     sinon.stub(request).yields(null, JSON.stringify({ 
      price: '100 USD' 
     })); 
     done(); 
    }); 

    it('getTicker function should call request on example ticker', function(done) { 
     mymodule.getTicker(function(error, result){ 
      request.called.should.be.equal(true); 
      done(); 
     }); 
    }); 

}); 

Ich weiß, ich sinon.stub (objname, zuordnen kann‚funcname‘) oder sinon.stub ("funcname"), aber diese setzen nur das äußere Objekt, ich versuche die Funktionsanforderung zu stubben

Irgendwelche Ideen, wie man das macht? Vielleicht muss ich auch einen Spion verwenden (aber wie?) Oder gibt es einen besseren Ansatz zum Testen der obigen getTicker-Funktion?

Antwort

6

Sie erhalten die undefinierte Nachricht, weil die request Variable unbekannt ist n den Umfang Ihres Tests. Selbst wenn Sie dies korrigieren und der Bibliothek die Bibliothek request zuweisen würden, würden Sie dennoch einen Fehler erhalten, da sinon für jedes bereitgestellte Objekt eine Methode benötigt, um einen Stub zu erstellen.

Die Konsequenz von solchem ​​ist, dass die request Funktion selbst nicht abgestempelt werden kann, da sie nicht auf einem Objekt existiert, sondern als eine Funktion, auf der andere Methoden definiert sind. Um die Testbarkeit zu unterstützen, ist es daher vorzuziehen, auf request direkt in Ihrem Code zu verzichten und stattdessen seine angehängten Methoden zu verwenden, die dann stubbed sein können. Zum Beispiel:

my_app.js

MyModule.prototype.getTicker = function(callback) { 
    request.get('http://example.com/api/ticker', function(error, response) { 
    ... 
    }); 
}; 

my_test.js

var request = require('request'); 

before(function() { 
    sinon.stub(request, 'get').yields(null, JSON.stringify({price: '100 USD'})); 
}); 

it('getTicker function should call request on example ticker', function() { 
    mymodule.getTicker(); 
    request.get.called.should.be.equal(true); 
}); 

(Man beachte, daß Mokka asynchron ist un-laufen, wenn notwendig, ein Stub synchron ist).

+0

Ok super, dachte nicht, die Get-Methode auf diese zu verwenden. Jetzt kann ich auch einen Spion verwenden, um zu überprüfen, ob der Rückruf aufgerufen wurde, denke ich. –

+0

Ahh yup Ich kann überprüfen, dass der Rückruf aufgerufen wurde. aber ich benutze eine etwas andere Syntax 'mymodule.getTicker (callback);' request.get.should.have.been.called; 'und' request.get.should.have.been.called; 'Thanks a ton ! –