如何在玩笑中模拟外部函数调用

How to mock external function call in jest

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

templeate.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 函数。我如何正确模拟它们以 return 一些虚拟结果?

你可以开玩笑地使用mockImplementation()。有了这个,您可以 spyOn() 对 class 方法或文件中的函数。例如,在您的情况下,让我们考虑一个文件名 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()

您可以在此处阅读有关 mockImplementation() 的更多信息 Jest Mock Implementation