Как заглушить методы Мангуста с несколькими аргументами в Sinon? - PullRequest
0 голосов
/ 28 февраля 2019

Я использую Mongoose в Node.js, и вот мой метод DAO.

function findPostsByCategoryId(categoryId, first, second) {
    var sortingOrd = { 'createdAt': -1 };
    return Post.find({ 'categoryId': categoryId }).sort(sortingOrd).skip(first).limit(second);
}

Теперь я хочу поставить такой метод в моем тестовом примере, используя Sinon.

describe('findPostsByCategoryId', function () {
    it('should find post by category id', function () {
        var stub = sinon.stub(Post, 'find');
        stub.callsFake(() => {
            return Promise.resolve(posts);
        });
        postDao.findPostsByCategoryId(1, 2, 3).then(response => {
            assert.length(response, 1);
        })
            .catch((error) => {
                assert.isDefined(error);
            });
    });
});

Это возвращает мне сообщение об ошибке «TypeError: Post.find (...). Sort не является функцией».

Можете ли вы пролить свет на то, как заглушить метод DAO, который имеет несколькофункции, связанные с ним?

1 Ответ

0 голосов
/ 01 марта 2019

Чтобы объединить функции модульного тестирования, просто соедините экземпляры stub и spy и убедитесь, что они были вызваны с ожидаемыми значениями:

it('should find post by category id', function () {
  const limitSpy = sinon.spy();
  const skipStub = sinon.stub().returns({ limit: limitSpy });
  const sortStub = sinon.stub().returns({ skip: skipStub });
  const findStub = sinon.stub(Post, 'find').returns({ sort: sortStub });

  postDao.findPostsByCategoryId(1, 2, 3);

  sinon.assert.calledWithExactly(findStub, { 'categoryId': 1 });  // SUCCESS
  sinon.assert.calledWithExactly(sortStub, { 'createdAt': -1 });  // SUCCESS
  sinon.assert.calledWithExactly(skipStub, 2);  // SUCCESS
  sinon.assert.calledWithExactly(limitSpy, 3);  // SUCCESS
});
...