【问题标题】:Jest - How to mock a function inside available functionJest - 如何在可用函数中模拟函数
【发布时间】:2020-01-06 17:24:26
【问题描述】:

我在一个文件中有如下函数:

import logger from 'logger-module';
import spir from '../spir';

const spirA = new spir(
  process.env.USERNAME,
  process.env.PASSWORD,
  process.env.API_KEY,
  process.env.SMS_WORKSPACE_ID,
  process.env.SMS_TEMPLATE_ID
);

const spirSMS = params => {
  return new Promise((resolve, reject) => {
    spirA.sms(params).then(resolve, reject);
  });
};

export const send = params => {
  logger.info('Sending new sms...');
  const { to: recipients, invalidNumber } = params;
  const promises = recipients.map(number =>
   spirSMS({ to: number, subject: params.subject, body: params.body })
  );
  return Promise.all(promises).then(() => {
    logger.info(`SMS has been sent to ${recipients.toString()}!`);
    return {
      message: `SMS has been sent to ${recipients.toString()}`,
      data: {
        recipients,
        invalid_recipients: invalidNumber
      }
    };
  });
};

如何在 recipients.map

中模拟 spirSMS

我发现它是一个循环函数,所以我不确定如何模拟它。 非常感谢!

【问题讨论】:

    标签: node.js api request jestjs


    【解决方案1】:

    我可能会在这里使用类来更好地测试您的代码。有这样的想法

    class SomeClass {
      constructor(spirSms) {
        this.spirSms_ = spirSms;
      }
    
      send(params) {
        logger.info('Sending new sms...');
        const { to: recipients, invalidNumber } = params;
        const promises = recipients.map(number =>
         this.spirSms_({ to: number, subject: params.subject, body: params.body })
        );
        return Promise.all(promises).then(() => {
          logger.info(`SMS has been sent to ${recipients.toString()}!`);
          return {
            message: `SMS has been sent to ${recipients.toString()}`,
            data: {
              recipients,
              invalid_recipients: invalidNumber
            }
          };
        });
      }
    }
    
    module.exports = SomeClass;
    

    然后你会得到一些main.js,它将实例化你的类并注入spirSms

    const spirA = new spir(
      process.env.USERNAME,
      process.env.PASSWORD,
      process.env.API_KEY,
      process.env.SMS_WORKSPACE_ID,
      process.env.SMS_TEMPLATE_ID
    );
    
    const spirSMS = params => {
      return new Promise((resolve, reject) => {
        spirA.sms(params).then(resolve, reject);
      });
    };
    
    const someClass = new SomeClass(spirSMS);
    someClass.send(params);
    

    现在在您测试SomeClass 时,您可以注入任何模拟spirSms,它基本上可以满足您的需求。

    希望这会有所帮助。

    【讨论】:

    • 谢谢。不幸的是,我不能修改你建议的代码,因为它是别人写的-_-如果我有权修复,它也会影响系统中的其他服务这需要大量的时间和精力
    • 在这种情况下,您可以使用https://www.npmjs.com/package/mock-require,它可以模拟主文件中所需的完整文件。
    • 谢谢老哥,客户端不允许使用外部库。
    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2021-02-27
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2022-06-29
    相关资源
    最近更新 更多