【问题标题】:How to mock external function call in jest如何开玩笑地模拟外部函数调用
【发布时间】:2021-11-28 18:10:28
【问题描述】:

我想用 jest 来测试这个功能。这是我的代码-

模板.ts

export const generateSalamWelcome = async function (
      actionSource: IActionSource,
      actionDetails: IActionDetails
    ): Promise<IReplyTemplate[] | undefined> {
      try {
        const { pageId } = actionSource;
        const { actionExt } = actionDetails;
        const restaurantData = await getRestaurantQueriesMultiple(pageId, []);
        if (restaurantData) {
          const replyTemplates: IReplyTemplate[] = [];
          const { enOnly, bnOnly } = restaurantData;
          const mode = getMode(enOnly, bnOnly, actionExt || languageModes.EN);
          replyTemplates.push(
            generateTextTemplate(
              selectTextEnBn(mode, strings.salamWelcomeEn, strings.salamWelcomeBn)
            )
          );
          return replyTemplates;
        }
      } catch (err) {
        logger.error(err);
      }
    };

我想模拟 getRestaurantQueriesMultiple、getMode 和 generateTextTemplate 函数。如何正确模拟它们以返回一些虚拟结果?

【问题讨论】:

    标签: node.js jestjs mocking


    【解决方案1】:

    您可以开玩笑地使用mockImplementation()。有了这个,你可以spyOn() 在文件中的类方法或函数上。例如,在您的情况下,让我们考虑一个文件名MyFile.ts,您在其中导出了函数getMode()。如果您的getMode() 存在于同一文件template.ts 中,则不要将文件名视为MyFile,而是使用template.ts。所以,在你的 it 块内你可以做这样的事情,

    const dummyResult = 'dummyData';
    
    jest.spyOn(MyFile, 'getMode')
      .mockImplementation(() => {
        return Promise.resolve(dummyResult);
      })
    

    同样,您可以对getRestaurantQueriesMultiple()generateTextTemplate() 执行相同的操作。但请确保在调用实际函数之前模拟所有这些函数,在你的情况下是 generateSalamWelcome()

    你可以在这里Jest Mock Implementation阅读更多关于mockImplementation()的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 2019-11-17
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多