2017-04-26 116 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); 
     }); 
    }); 
    }) 
}) 
相關問題