2016-05-22 10 views
1

Ich habe ein Modul, das eine Methode ruft, die Bluebird verspricht verwendet. Hier ist das Modul, vereinfacht. Cassandra ist einfach ein Wrapper um einige db Anrufe, die sie promisfies:Kann Sinon Spion im Zusammenhang mit einem Mokka-Test mit Methode aufgerufen werden, die Methode mit Versprechen ruft

var Cassandra = require('../lib/cassandraObject'); 
var cassandra = new Cassandra(); 
exports.doIt = function _doIt(req, res) { 
    cassandra.queryPromise("query", [1, 2, 3]) 
    .then(function (results) { 
     res.sendStatus(200); 
    }) 
    .catch(function(er) { 
     res.sendStatus(500); 
    }) 
} 

Ich versuche, dies zu testen mit Sinon und Sinon-drossel. Ich Stummel den Anruf für Cassandras Abfrage Versprechen, und ich mache res.sendStatus einen Spion:

it("makes a call to doIt", function() { 
     var qpMock = sinon.stub(Cassandra.prototype, "queryPromise").resolves(['yay!']); 
     var req = {}; 
     var res = { 
      sendStatus: sinon.spy(), 
     }; 
     myModule.doIt(req, res); 
     expect(qpMock.args[0][1][0]).to.equal(1); //ok 
     expect(res.sendStatus).to.have.been.calledWith(200); //error ! not called yet! 
    } 

ich mit diesen Bibliotheken gedacht, die dann() der Stubs sofort und nicht asynchron aufgerufen werden würde, aber dies nicht scheint der Fall zu sein. Der Aufruf von res.sendStatus() wird zwar aufgerufen, aber nachdem der Test den Gültigkeitsbereich überschritten hat.

Gibt es eine Möglichkeit zu wissen, wann die res.sendStatus() aufgerufen wird, und sie im Rahmen des Tests zu halten, damit ich auf den übergebenen Wert geltend machen kann?

Antwort

2

Ich würde vorschlagen, doIt() verkettbar machen, indem sie das Versprechen, die Rückkehr:

exports.doIt = function _doIt(req, res) { 
    return cassandra.queryPromise("query", [1, 2, 3]) 
        .then(function (results) { 
         res.sendStatus(200); 
        }) 
        .catch(function(er) { 
         res.sendStatus(500); 
        }) 
} 

Auf diese Weise Sie für die Fertigstellung in Ihrem Testfall warten können, so dass Sie res.sendStatus() überprüfen, wenn Sie sicher sind, dass es genannt wurde .

Da auch Mocha Versprechen aus der Box unterstützt, können Sie das Versprechen von doIt() zurückkehren, um sicherzustellen, Mocha wartet auf Ihren Test vollständig abgeschlossen sein, bevor Sie fortfahren:

it("makes a call to doIt", function() { 
    var qpMock = sinon.stub(Cassandra.prototype, "queryPromise").resolves(['yay!']); 
    var req = {}; 
    var res = { sendStatus: sinon.spy() }; 
    return myModule.doIt(req, res).then(() => { 
    expect(qpMock.args[0][1][0]).to.equal(1); 
    expect(res.sendStatus).to.have.been.calledWith(200); 
    }); 
})