L’une des questions les plus courantes sur les tests automatisés dans Laravel est de savoir comment écrire des tests pour l’utilisation de certaines API externes. Il y a trois façons de le faire, et je vais toutes les montrer dans cet article.
Ceci est un extrait textuel d’un chapitre de mon cours Advanced Laravel Testing
Nous parlerons de :
- Faire semblant de requêtes HTTP
- Cours de moquerie
- Utilisation de bacs à sable externes
Par exemple, imaginons que vous utilisiez un service externe pour obtenir les informations par adresse IP, avec Laravel HTTP Client.
1private static function getIpData(string $ip): array
2{
3 $token = config('location.ipdata.token', '');
4
5 $url = "https://api.ipdata.co/{$ip}?api-key=".$token;
6
7 return Http::get($url)->throw()->json();
8}
Comment testeriez-vous si cela fonctionne?
Le code ci-dessus provient d’un véritable projet open source Monica. Jetons un coup d’œil à nos options.
Option 1. Falsifier des requêtes HTTP avec Http :: fake ()
Les auteurs du projet simulent les requêtes HTTP pour les services externes.
Ils utilisent également une chose appelée Fixtures, qui ne sont que des ensembles de données pré-préparés. Donc, si nous jetons un coup d’œil à tests/Fixtures
, il existe des ensembles de données préparés au format JSON. Ipdata.json contient un exemple de réponse d’un service externe sur IP. Ainsi, l’adresse IP doit contenir cet exemple d’informations :
1{
2 "ip": "12.34.56.78",
3 "is_eu": true,
4 "city": "Paris",
5 "region": "\u00cele-de-France",
6 "region_code": "IDF",
7 "country_name": "France",
8 "country_code": "FR",
9 "continent_name": "Europe",
10 "continent_code": "EU",
11 "latitude": 0,
12 "longitude": 0,
13 "postal": "75000",
14 "calling_code": "33",
15 "flag": "https://ipdata.co/flags/fr.png",
16 "emoji_flag": "\ud83c\uddeb\ud83c\uddf7",
17 "emoji_unicode": "U+1F1EB U+1F1F7",
18 "languages": [
19 {
20 "name": "French",
21 "native": "Fran\u00e7ais"
22 }
23 ],
24 "currency": {
25 "name": "Euro",
26 "code": "EUR",
27 "symbol": "\u20ac",
28 "native": "\u20ac",
29 "plural": "euros"
30 },
31 "time_zone": {
32 "name": "Europe/Paris",
33 "abbr": "CET",
34 "offset": "+0100",
35 "is_dst": false,
36 "current_time": "2021-11-01T00:00:00+01:00"
37 },
38 "threat": {
39 "is_tor": false,
40 "is_proxy": false,
41 "is_anonymous": false,
42 "is_known_attacker": false,
43 "is_known_abuser": false,
44 "is_threat": false,
45 "is_bogon": false
46 },
47 "count": "0"
48}
Maintenant, comment ces exemples de réponses JSON sont-ils utilisés dans les tests ? Ce ipdata.json
l’utilisation des fichiers peut être trouvée dans le tests/Unit/Helpers/RequestHelperTest.php
méthode get_infos_from_ip()
:
1class RequestHelperTest extends TestCase
2{
3 /** @test */
4 public function get_infos_from_ip()
5 {
6 config(['location.ipdata.token' => 'test']);
7
8 $body = file_get_contents(base_path('tests/Fixtures/Helpers/ipdata.json'));
9 Http::fake([
10 'https://api.ipdata.co/*' => Http::response($body, 200),
11 ]);
12
13 $this->assertEquals(
14 [
15 'country' => 'FR',
16 'currency' => 'EUR',
17 'timezone' => 'Europe/Paris',
18 ],
19 RequestHelper::infos('test')
20 );
21 }
22}
Maintenant, que fait ce test ?
Tout d’abord, il écrase la configuration, donc nous n’exposons pas et n’utilisons pas le jeton en direct de ce service ipdata.co.
Ensuite, on utilise Http::fake()
. Vous pouvez donc simuler la requête vers n’importe quelle URL, ici https://api.ipdata.co/*
ils utilisent des astérisques pour que quelle que soit l’URL avec api.ipdata.co
serait truqué avec la réponse. Cette réponse vient du ipdata.json
vous avez vu plus tôt.
Nous falsifions donc la demande d’API pour api.ipdata.co
donc il ne ferait pas la vraie requête HTTP, mais à la place…