Ошибка при тестировании функции с помощью sinon и chai - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь начать тестирование в своих проектах, и некоторые вещи я могу проверить правильно, а другие нет.Вот функция, которую я хочу проверить.

exports.rateReview = async (req, res, next) => {
    try {
        const review = await Review.findById(req.body.id);
        if (review) {
            if (req.body.type === 'like') await review.like();

            if (req.body.type === 'dislike') await review.dislike();
        }

        res.send('Ok');
    } catch (err) {
        console.log(err);
    }
}

Я пытаюсь проверить, если функции like () и dislike () вызываются в зависимости от req.body.type.Итак, вот мой тестовый файл.

const sinon = require('sinon');
const chai = require('chai');
const sinonChai = require("sinon-chai");
const mongoose = require('mongoose');

const seriesController = require('../../../../src/series-search/controllers/series.controller');
const Review = require('../../../../src/series-search/models/Review');

const expect = chai.expect;
chai.use(sinonChai);

let spyFindById, spyLike, spyDislike;

beforeEach(() => {
    spyLike = sinon.spy(Review.prototype, 'like');
    spyDislike = sinon.spy(Review.prototype, 'dislike');
    spyFindById = sinon.stub(Review, 'findById').returns({});
});

afterEach(() => {
    spyLike.restore();
    spyDislike.restore();
    spyFindById.restore();
});

describe('Series controller', () => {
    describe('search()', () => {

    });

    describe('addReview()', () => {
        it('should call findById() with review id');
    });

    describe('rateReview()', () => {
        it('should call review.like() if type is like', (done) => {
            const req = {
                body: {
                    id: '123456',
                    type: 'like'
                }
            };
            const res = {
                send: sinon.stub()
            };
            
            const spyLike = sinon.spy(review, 'like');
            seriesController.rateReview(req, res, null);

            expect(spyLike).to.have.been.calledOnce;
            done();
        });

        it('should call review.dislike() if type is dislike');
    });
});

Тест продолжает проваливаться, так как он говорит, что ожидает, что «like» был вызван один раз, но это не так.Я много чего пробую и ищу в Google, но не могу заставить его работать.Если у кого-то есть идеи, я был бы признателен.

Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Правильный способ сделать это - вернуть like и dislike, когда вы заглушите findById метод.

....

let spyFindById, spyLike, spyDislike;

beforeEach(() => {
  spyLike = sinon.spy();
  spyDislike = sinon.spy();

  // spy `like` and `dislike` here so our `review` variable can be spied. 
  // use `resolves` since it is promised based function
  spyFindById = sinon.stub(Review, 'findById').resolves({
    like: spyLike,
    dislike: spyDislike
  });
});

afterEach(() => {
  sinon.restore(); // use sinon.restore() is enough if you use the latest Sinon
});

describe('Series controller', () => {
  describe('rateReview()', () => {

    // no need to use `done` if we can use `async await`
    it('should call review.like() if type is like', async () => {
      const req = {
        body: {
          id: '123456',
          type: 'like'
        }
      };
      const res = {
        send: sinon.stub()
      };

      await seriesController.rateReview(req, res, null);

      expect(spyLike).to.have.been.calledOnce;
    });

    it('should call review.dislike() if type is dislike');
  });
});
...