Как сделать юнит тест для метода отправки сообщений на Email?

Необходимо написать юнит-тест для файла mail.php, который содержит метод для отправки сообщения на Email.
header("Location: http://landingtaxi/");	

$name = $_POST['firstname'];
$email = $_POST['email_box'];
$col = $_POST['select_col'];

if(isset($name) && isset($email) && isset($col)){

	switch ($col) {
		case 2:
			$col_name = "ГОСТ";
			break;
		case 3:
			$col_name = "Яндекс";
			break;
		case 4:
			$col_name = "Яндекс + Light Box";
			break;
		default:
			$col_name = "Не выбрана";
			break;
	}

	require_once "SendMailSmtpClass.php"; // подключаем класс
	$mailSMTP = new SendMailSmtpClass('ivanbat2@mail.ru', '***', 'ssl://smtp.mail.ru', 465, "UTF-8");
	// $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'порт', 'кодировка письма');

	// от кого
	$from = array(
	"Иван", // Имя отправителя
	"ivanbat2@mail.ru" // почта отправителя
	);
	// кому
	$to = 'ivanbat2@mail.ru';


	$result = $mailSMTP->send($to, 'Заказ на оклейку', "Поступил заказ на оклейку автомобиля. Выбранная опция: " . $col_name . ". Имя заказчика: " . $name . ". Почта заказчика: " . $email, $from);
	// $result = $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Отправитель письма');

	if($result === true){
		echo "Done";
	}else{
		echo "Error: " . $result;
	}

	$to = $email;

	$result = $mailSMTP->send($to, 'Оклейка автомобиля', "Благодарим вас за выбор нашей компании! Вам скоро перезвонят для уточнения деталей. С уважением, Батурин Иван!", $from);
}

exit;
  • Вопрос задан
  • 461 просмотр
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
Юнит-тест:
Юнит-тест невозможен в данном случае, тк нет этого самого юнита в виде чистой функции (без побочных эффектов). Тут сплошной сайд-эффект: отправка на SMTP, прослушивание HTTP, то есть особо не потестируешь юнитами.
Объектом тестирования юнит-тестом служит или функция или объект. А у вас и нет ни функции/процедуры даже хотя бы.

Это будет функциональный (если будете из кода вызывать) или приемочный (если свое приложение через HTTP дергать) в любом случае.

Как по итогу все же протестировать:
Такой функционал обычно тестируют так:
  • для начала настройки отправки почты переносят в конфиг
  • в тестовом окружении в конфиг подсовывают настройки своего SMTP сервера
  • поднимают фейковый почтовый сервер, например Mailhog на Go (очень легко ставится)
  • выполняют работу скрипта, чтобы почта ушла, почта летит на ваш подмененный сервер, и у него через АПИ проверяют, что письмо пришло


Если возьмете Codeception, установите Mailhog на машину, где будут гоняться тесты, или докер-контейнер (вообще парой строк, например если в Gitlab CI гоняете), и поставите модуль Codeception + Mailhog. То легко все проделаете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы