Jest - Как смоделировать функцию внутри доступной функции - PullRequest
0 голосов
/ 06 января 2020

У меня есть функции в файле, как показано ниже:

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

Как я могу издеваться spirSMS внутри receients.map

I обнаружил, что это была функция al oop, так что я не уверен, как это сделать. Большое спасибо!

1 Ответ

0 голосов
/ 06 января 2020

Я бы, вероятно, использовал здесь классы для лучшей тестируемости вашего кода. что-то вроде этого

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, который в основном будет делать то, что вы ищете.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...