2015-01-08 6 views
10

ich bekommen, wie Mungo Modelle Stub (dank Stubbing a Mongoose model with Sinon), aber ich verstehe nicht ganz, wie wie Anrufe Stummel:Sinon Mit Stub gekettet Mongoose ruft

myModel.findOne({"id": someId}) 
    .where("someBooleanProperty").equals(true) 
    ... 
    .exec(someCallback); 

ich folgendes versucht:

var findOneStub = sinon.stub(mongoose.Model, "findOne"); 
sinon.stub(findOneStub, "exec").yields(someFakeParameter); 

vergeblich, irgendwelche Vorschläge?

Antwort

14

ich gelöst habe es durch folgende Maßnahmen:

var mockFindOne = { 
    where: function() { 
     return this; 
    }, 
    equals: function() { 
     return this; 
    }, 
    exec: function (callback) { 
     callback(null, "some fake expected return value"); 
    } 
}; 

sinon.stub(mongoose.Model, "findOne").returns(mockFindOne); 
7

Werfen Sie einen Blick auf sinon-mongoose. Sie können verkettete Methoden mit nur wenigen Zeilen erwarten:

Sie finden Arbeitsbeispiele zum Repo.

Auch eine Empfehlung: Verwenden Sie mock Methode anstelle von stub, die überprüfen wird, ob die Methode wirklich existiert.

+1

Das gibt mir: "TypeError: sinon.stub (...). Erwartet ist keine Funktion" – schw4ndi

+1

@schw4ndi du verwendest 'sinon.stub' anstelle von' sinon.mock'. Sag mir, wenn das dein Problem nicht löst. – Gon

1

Wenn Sie Versprechen verwenden, können Sie sinon-as-promised versuchen:

sinon.stub(Mongoose.Model, 'findOne').returns({ 
    exec: sinon.stub().rejects(new Error('pants')) 
    //exec: sinon.stub(). resolves(yourExepctedValue) 
}); 
1

Ein anderer Weg, um die Prototyp-Funktionen der erstellten Query (mit sinon) Stummel oder auszuspionieren ist:

const mongoose = require('mongoose'); 

sinon.spy(mongoose.Query.prototype, 'where'); 
sinon.spy(mongoose.Query.prototype, 'equals'); 
const query_result = []; 
sinon.stub(mongoose.Query.prototype, 'exec').yieldsAsync(null, query_result); 
Verwandte Themen