Using Sinon to stub chained Mongoose calls

前端 未结 5 1473
感情败类
感情败类 2020-12-31 10:34

I get how to stub Mongoose models (thanks to Stubbing a Mongoose model with Sinon), but I don\'t quite understand how to stub calls like:

myModel.findOne({\"         


        
相关标签:
5条回答
  • 2020-12-31 10:41

    Take a look to sinon-mongoose. You can expects chained methods with just a few lines:

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

    You can find working examples on the repo.

    Also, a recommendation: use mock method instead of stub, that will check the method really exists.

    0 讨论(0)
  • 2020-12-31 10:42

    I use promises with Mongoose and stub the methods like this:

    const stub = sinon.stub(YourModel, 'findById').returns({
        populate: sinon.stub().resolves(document)
    })
    

    Then I can call it like:

    const document = await YourModel.findById.populate('whatever');
    
    0 讨论(0)
  • 2020-12-31 10:47

    I've solved it by doing the following:

    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);
    
    0 讨论(0)
  • 2020-12-31 10:56

    Another way is to stub or spy the prototype functions of the created Query (using 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);
    
    0 讨论(0)
  • 2020-12-31 11:00

    If you use Promise, you can try sinon-as-promised:

    sinon.stub(Mongoose.Model, 'findOne').returns({
      exec: sinon.stub().rejects(new Error('pants'))
      //exec: sinon.stub(). resolves(yourExepctedValue)
    });
    
    0 讨论(0)
提交回复
热议问题