使用SINON存根链接的Mongoose调用

nxowjjhe  于 2022-09-21  发布在  Go
关注(0)|答案(6)|浏览(158)

我知道如何存根Mongoose模型(多亏了Stubbing a Mongoose model with Sinon),但我不太明白如何存根调用,比如:

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

我尝试了以下几种方法:

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

无济于事,有什么建议吗?

rkue9o1l

rkue9o1l1#

我通过做以下几件事解决了这个问题:

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);
t9aqgxwy

t9aqgxwy2#

看看sinon-mongoose。您可以期待只有几行代码的链接方法:

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

您可以在回购上找到可用的示例。

另外,建议使用mock方法而不是stub,这样可以检查该方法是否确实存在。

bkkx9g8r

bkkx9g8r3#

另一种方法是存根或侦察所创建查询的原型函数(使用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);
vbopmzt1

vbopmzt14#

如果您使用Promise,您可以尝试sinon-as-promised

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

cgyqldqp5#

我对Mongoose使用承诺,并使用如下方法:

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

然后我可以这样称呼它:

const document = await YourModel.findById.populate('whatever');
lvjbypge

lvjbypge6#

使用多个Mongoose方法存根,使用以下代码。服务代码

models.Match.findOne({ where: { id: ChangeInningInputType.id } })
      .then((match) => {
        if (!match) {
         throw Error('Match not found');
        }
        models.Match.update(
          { inning: ChangeInningInputType.inning },
          { where: { id: ChangeInningInputType.id } },
        );
        return resolve(match);
      })
      .catch((error) => {
        return reject(error);
      });

测试用例代码

it('Success test case for inning update', async () => {
    const bulkCreateStub = sinon
      .stub(models.Match, 'findOne')
      .resolves(inningResponse);

    const updateStub = sinon
      .stub(models.Match, 'update')
      .resolves(inningResponse);

    const aa = await changeInning(
      {},
      {
        ChangeInningInputType: inningRequest,
      },
    );
    console.log('updateStub===>', updateStub);
    expect(updateStub.calledOnce).to.equal(true);

    expect(bulkCreateStub.calledOnce).to.equal(true);
  });

相关问题