2015-01-08 16 views

risposta

14

ho risolto facendo quanto segue:

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

Date un'occhiata a sinon-mongoose. È possibile aspettarsi metodi concatenati con poche righe:

sinon.mock(YourModel).expects('findOne') 
    .chain('where').withArgs('someBooleanProperty') 
    .chain('exec') 
    .yields(someError, someResult); 

È possibile trovare esempi di lavoro sul repository.

Inoltre, un consiglio: utilizzare il metodo mock anziché stub, che verificherà che il metodo esiste realmente.

+1

questo mi dà: "TypeError: sinon.stub (...). Aspect non è una funzione" – schw4ndi

+1

@ schw4ndi stai usando 'sinon.stub' invece di' sinon.mock'. Dimmi se questo non risolve il tuo problema. – Gon

1

Se si utilizza Promessa, si può provare sinon-as-promised:

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

Un altro modo è quello di stub o spiare le funzioni prototipo della query creata (usando Sinon):

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); 
Problemi correlati