[PHP] Générer une adresse e-mail qui passe la validation DNS avec Laravel

Lors d’un développement d’un service avec Laravel, j’ai été confronté à un petit problème lors des tests unitaires. Plus précisément des tests où il était nécessaire de vérifier une adresse e-mail dès l’appel de la route. En effet, dans le cas de l’utilisation de la validation DNS, vos tests peuvent parfois échouer. Il existe toutefois une solution pour contourner ces erreurs.

Validation DNS d'une adresse e-mail dans les tests unitaires

Contexte

Supposons le code suivant dans l’un de vos controllers :

$validator = \Validator::make($request->all(), [
	'email' => 'required|email:rfc,dns'
], ValidationMessages::messages());

if ($validator->fails()) 
{ 
	return response()->json([
		"errors" => $validator->errors()
	], 400);
}

Cette vérification permet de renvoyer un JSON contenant l’ensemble des erreurs de validation. Dans ce cas nous ne vérifions que l’adresse e-mail avec la règle de format RFC ainsi que la validation DNS.

Générer un e-mail qui passe la validation DNS

Dans votre test unitaire, au lieu de passer un e-mail (avec un domaine à vous, par exemple) lors de l’appel de votre route, vous pouvez utiliser le code suivant. Ce morceau de code fait appel à une librairie appelée FakerPHP. Elle est automatiquement intégrée à vos services Laravel afin de pouvoir fournir une grande variété de méthodes de test.

$faker = \Faker\Factory::create();
$email = $faker->freeEmail();
$response = $this->get(
	'/v1/private/recipient/email?email=' . $email
);

N’oubliez pas d’adapter le code en fonction de la méthode HTTP attribuée à votre route. En regardant ce que fait le code de la méthode freeEmail() vous pourrez constater qu’elle génère une adresse e-mail aléatoire parmi 3 domaines considérés comme « sûrs ».

Pour en savoir plus sur les différentes méthodes disponibles, vous pouvez consulter la documentation de FakerPHP.

Sources

Voir aussi

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *