2017-04-26 72 views
1

我想测试一个函数。这个功能也需要其他功能,但这个功能会被嘲笑。如何使用Jest测试和模拟功能Nodejs

这里是我的功能

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(); 
    }); 
    }) 
}) 

我还在困惑如何使用玩笑,也嘲弄了所需的相关测试该函数的功能。

回答

0

一对夫妇的事情,我可以看到:

  • 你能避免使用玩笑的done功能通过返回无极链,这玩笑将用来确定当测试完成。
  • 你不需要模拟函数的实现,只是它们的返回值。您可能想要创建一个额外的测试来模拟实现行为,但是从控制其输出开始就很好。

下面是测试的外观:

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); 
     }); 
    }); 
    }) 
}) 
相关问题