【问题标题】:How to test and mocking a function Nodejs with Jest如何使用 Jest 测试和模拟 Nodejs 函数
【发布时间】:2017-04-26 05:57:27
【问题描述】:

我想测试一个函数。这个函数还需要其他函数,但是这个函数会被玩笑。

这是我的功能

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 测试该函数以及如何模拟所需的依赖感到困惑。

【问题讨论】:

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


    【解决方案1】:

    我可以看到几件事:

    • 您可以通过返回 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);
            });
        });
      })
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      相关资源
      最近更新 更多