如何使用Jest测试和模拟Nodejs函数

时间:2017-04-26 05:57:28

标签: node.js unit-testing callback mocking jestjs

我想测试一个功能。这个函数也需要其他函数,但是这个函数将用jest进行模拟。

这是我的功能

translate(args, cb) {
    const transid = args.transid;
    const language = args.language;
    const defaultValue = args.defaultValue || '';

    if (transid === null || transid === '') {
      return cb(new Error('Error. Need TransiD'));
    }
    if (language === null || language === '') {
      return cb(new Error('Error. Need language'));
    }

    return this.translation(transid, language, defaultValue)
      .then((res) => {
        return cb(null, res);
      });
  }

该功能需要功能'翻译'。在测试过程中,我会嘲笑它。

这是我的测试功能

describe('Translator', () => {
  describe('translate', () => {

    it('Should return translated value', (done) => {
      const args = {
        transid: 1,
        language: 'EN',
        defaultValue: 'defaultValue',
      }
      const cb = jest.fn((err, res) => {

      });
      translator.translation = jest.fn((transid, language, defaultValue) => {
        // done();
      })

      translator.translate(args, cb);
      done();
    });
  })
})

我仍然在混淆如何使用Jest测试该函数以及模拟所需的依赖项。

1 个答案:

答案 0 :(得分:0)

我可以看到几件事:

  • 您可以通过返回Promise链来避免使用Jest的done函数,Jest将使用该链来确定测试何时完成。
  • 您不需要模拟函数的实现,只需要模拟它们的返回值。您可能想要创建一个模拟实现行为的附加测试,但最好只控制它们的输出。

以下是测试的外观:

describe('Translator', () => {
  describe('translate', () => {
    it('Should return translated value', () => {
      const args = {
        transid: 1,
        language: 'EN',
        defaultValue: 'defaultValue',
      }

      const cb = jest.fn();

      const res = {};

      translator.translation = jest.fn()
        .mockReturnValue(Promise.resolve(res));

      return translator.translate(args, cb)
        .then(() => {
          expect(translator.translation).toHaveBeenCalledTimes(1);
          expect(translator.translation)
            .toHaveBeenCalledWith(1, 'EN', 'defaultValue');

          expect(cb).toHaveBeenCalledTimes(1);
          expect(cb).toHaveBeenCalledWith(null, res);
        });
    });
  })
})