Синон. js слежка за проходящим объектом, метод не работает - PullRequest
0 голосов
/ 29 февраля 2020

Вот класс контроллеров:

  static async addCourse(req, res) {
    if (!req.body.name) {
      util.setError(statusCode.BAD_REQUEST, 'Please provide complete details');
      return util.send(res);
    }
    const newCourse = req.body;
    try {
      const createdCourse = await CourseService.addCourse(newCourse);
      util.setSuccess(statusCode.CREATED, 'Course Added!', createdCourse);
      return util.send(res);
    } catch (error) {
      util.setError(statusCode.BAD_REQUEST, error.message);
      return util.send(res);
    }
  }

Класс утилит:

export default class Util {
  constructor() {
    this.statusCode = null;
    this.type = null;
    this.data = null;
    this.message = null;
  }

  setSuccess(statusCode, message, data) {
    this.statusCode = statusCode;
    this.message = message;
    this.data = data;
    this.type = 'success';
  }

  setError(statusCode, message) {
    this.statusCode = statusCode;
    this.message = message;
    this.type = 'error';
  }

  send(res) {
    // const result = {
    //   status: this.type,
    //   message: this.message,
    //   data: this.data,
    // };

    switch (this.statusCode) {
      case status.OK:
        return res.status(this.statusCode).json(this.data);
      case status.CREATED:
        return res.status(this.statusCode).json(this.data);
      case status.SUCCESS_NO_CONTENT:
        return res.status(this.statusCode).end();
      case status.BAD_REQUEST:
        return res.status(this.statusCode).json({
          status: this.type,
          message: this.message,
        });
      case status.NOT_FOUND:
        return res.status(this.statusCode).end();
      default:
        return res.status(status.INTERNAL_SERVER_ERROR).end();
    }
  }
}

Тестовый случай контроллера:

    it('should be able to create course', (done) => {
    const request = {
      body: {
        id: 'f6859199-400b-48db-9a74-9071514ca3d2',
        name: 'physics',
      },
    };


    const response = {
    };

    response.status = function status() { return { json() {} }; };

    let responseSpy = sinon.spy(response)

    const addCourseStub = sinon.stub(courseService, 'addCourse').resolves(request);

    CourseController.addCourse(request, response);

    sinon.assert.calledWith(addCourseStub, request.body);

    sinon.assert.called(responseSpy.status)

    addCourseStub.restore();
    done();
  });

Я тестирую контроллер addCourse. Для этого я проверяю 1. Если вызывается CourseService.addCourse с правильными аргументами 2. И я слежу за объектом ответа и проверяю, вызывается ли status() (из служебного класса)

Ожидается :

responseSpy.status для вызова.

Получил: AssertError: expected status to have been called at least once but was never called

Что я делаю не так?

Я пытался использовать заглушки на Util class, он тоже не работал.

Вот ссылка на github для testcase - https://github.com/openmohan/nodejs-restapi/blob/master/test/server/controllers/course.spec.js

Версия Sinon - "^ 9.0.0"

Заранее спасибо за помощь.

...