Как проверить асинхронные функции с помощью sinon? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть класс с именем PostController, и я пытаюсь проверить следующую функцию create:

class PostController {
  constructor(Post) {
    this.Post = Post;
  }

  async create(req, res) {
    try {
      this.validFieldRequireds(req);
      const post = new this.Post(req.body);
      post.user = req.user;
      ...some validations here
      await post.save();
      return res.status(201).send(message.success.default);
    } catch (err) {
      console.error(err.message);
      const msg = err.name === 'AppError' ? err.message : 
      message.error.default;
      return res.status(422).send(msg);
    }
 }

Мой тестовый класс:

import sinon from 'sinon';
import PostController from '../../../src/controllers/posts';
import Post from '../../../src/models/post';

describe('Controller: Post', async () => {
  it.only('should call send with sucess message', () => {
    const request = {
      user: '56cb91bdc3464f14678934ca',
      body: {
        type: 'Venda',
        tradeFiatMinValue: '1',
        ... some more attributes here
      },
    };
    const response = {
      send: sinon.spy(),
      status: sinon.stub(),
    };

    response.status.withArgs(201).returns(response);
    sinon.stub(Post.prototype, 'save');
    const postController = new PostController(Post);

    return postController.create(request, response).then(() => {
      sinon.assert.calledWith(response.send);
    });
  });
});

Но я получаю следующую ошибку:

Ошибка: превышено время ожидания 5000 мс. Для асинхронных тестов и хуков, убедитесь, что "сделанный()" называется; если вы возвращаете обещание, убедитесь, что оно разрешено. (D: \ Projeto \ mestrado \ localbonnum-фоновый \ тест \ блок \ Контроллеры \ post_spec.js)

Почему?

1 Ответ

1 голос
/ 25 апреля 2019

Скорее всего, это из-за неправильного использования sinon.stub.

Вы

sinon.stub(Post.prototype, 'save');

, не сказав, что этот заглушка будет делать, так что в принципе этот заглушка ничего не будет делать (это означаетвозвращает undefined).ИДК, почему ты не видишь других подобных попыток ждать на заглушке.Тем не менее, вы должны правильно настроить будущую заглушку «save» - например, так:

const saveStub = sinon.stub(Post.prototype, 'save');
saveStub.resolves({foo: "bar"});
...