На самом деле, ваша функция sendTemplatedEmail
делает еще одну вещь, которая не указана в имени: инициализация транспорта. И это жесткая зависимость sendTemplatedEmail
. Вам нужно что-то сделать с этой зависимостью, чтобы сделать ее более тестируемой, возможные решения:
1) передать экземпляр транспорта в качестве аргумента. Рассмотрим следующее:
const sesConstructor = () => {
//...
return AWS.SES(...);
};
export const sendTemplatedEmail = (emailTo, templateName, templateData, ses = sesConstructor()) => {
const params = {...}
return ses.send(...);
}
В этом случае вы добавляете новый параметр к вашему экземпляру sendTemplatedEmail
ses, который по умолчанию получается из sesConstructor()
- это позволяет вам пропустить заглушку в тесте и легко протестировать ее.
Вы также можете поместить экземпляр в closure
, если он вам подходит:
export const sendTemplatedEmail = (ses = sesConstructor()) => (emailTo, templateName, templateData) => {
const params = {...}
return ses.send(...)
}
тогда вы будете использовать его:
sendTemplatedEmail()('some@person.com'...)
и в тесте вы передадите ему заглушку и легко протестируете:
sendTemplatedEmail(stubOfSes)('some@person.com'...)
Google dependency injection
, если вам нужно больше теории об этом.
2) Экспортируйте его. Почему бы вам не экспортировать объект с двумя реквизитами: sesConstructor
и sendTemplatedEmail
?
let emailSender = {
sesConstructor: () => {
//...
return AWS.SES(...);
},
sendTemplatedEmail: (emailTo, templateName, templateData) => {
// ...
return this.sesConstructor().sendTemplatedEmail(...);
};
export default emailSender;
В этом случае в вашем тестовом файле вам просто нужно указать метод импортируемого объекта sesConstructor
и получить его легко тестируемым.
Не думаю, что это полный список того, как это можно организовать, но это те направления, с которыми я бы работал.
Надеюсь, это поможет.