Testovanie
Geolocation::fake() v testoch vašej aplikácie nahradí manažéra zaznamenávajúcim fakom a vráti ho. Iba zaznamenáva: nedotkne sa žiadneho poskytovateľa, siete, cache ani sťahovania MaxMind a vyhľadávania odpovedajú výsledkami, ktoré pripravíte. GeolocationFake rozširuje GeolocationManager a nahradí koreň fasády aj väzbu v kontajneri, takže ho používa fasáda, injektovaný manažér aj makro $request->location():
use RoundlyConsulting\Geolocation\DataTransferObjects\Location;
use RoundlyConsulting\Geolocation\Enum\GeolocationType;
use RoundlyConsulting\Geolocation\Facades\Geolocation;
it('localises checkout from the visitor IP', function () {
$fake = Geolocation::fake([
'203.0.113.7' => new Location(
humanReadable: 'Springfield, US',
street: '',
city: 'Springfield',
countryIsoCode: 'US',
latitude: 39.7817,
longitude: -89.6501,
type: GeolocationType::Ip,
),
]);
$this->withServerVariables(['REMOTE_ADDR' => '203.0.113.7'])
->get('/checkout')
->assertOk();
$fake->assertLocated('203.0.113.7');
});Príprava výsledkov a overenie vyhľadávaní
$fake = Geolocation::fake();
$fake->seed('203.0.113.7', $location) // an IP
->seed('Main Street 1, Springfield', $hq) // an address
->seed('48.1486,17.1077', $point) // coordinates as "lat,lng"
->seedDefault($fallback) // anything not seeded
->seedDistance($distance); // returned by every distance() call
// ...exercise your code, then:
$fake->assertLocated('203.0.113.7');
$fake->assertProviderUsed('ipinfo'); // pinned via provider() / using()
$fake->assertProviderNotUsed('google');
// Or, for a code path that must not look anything up:
$fake->assertNothingLocated();Vzdialenosti, obnovy a cache
use RoundlyConsulting\Geolocation\DataTransferObjects\GeolocationQuery;
use RoundlyConsulting\Geolocation\Enum\DistanceType;
// Distances — through distance() or distanceBetween(); every argument is optional
$fake->assertDistanceRequested(from: $warehouse);
$fake->assertDistanceRequested($warehouse, $customer, DistanceType::Driving);
$fake->assertNoDistanceRequested();
// MaxMind refreshes — Geolocation::updateDatabase() and geolocation:db:update
$fake->assertDatabaseUpdated('GeoLite2-City'); // or no edition for any refresh
$fake->assertDatabaseNotUpdated();
// Cache maintenance
$fake->assertForgotten(GeolocationQuery::forIp('8.8.8.8'));
$fake->assertNothingForgotten();
$fake->assertCacheFlushed();
$fake->assertCacheNotFlushed();updateDatabase() na fake zaznamená edíciu a vráti nastavenú cestu — a keďže ju volá aj geolocation:db:update, zaznamená sa aj spustenie príkazu v teste.
Všetky metódy
| Metóda | Účel |
|---|---|
Geolocation::fake(array $results = []) | Nahradí manažéra fakom; výsledky podľa IP, adresy alebo „lat,lng“. |
seed(string $key, Location $location) | Pridá jeden pripravený výsledok (fluentne). |
seedDefault(?Location $location) | Výsledok pre každé vyhľadávanie bez pripraveného kľúča. |
seedDistance(?Distance $distance) | Vráti ho každé volanie distance(). |
assertLocated(string $key) | Kľúč sa aspoň raz vyhľadával. |
assertNothingLocated() | Neprebehlo žiadne vyhľadávanie. |
assertProviderUsed(string $name) | Vyhľadávanie, dávka, vzdialenosť alebo matica bežali pripnuté na toto meno cez provider() alebo using() — platí ktorékoľvek z pripnutých mien. |
assertProviderNotUsed(string $name) | Žiadne volanie nebolo pripnuté na toto meno. |
assertDistanceRequested(?$from, ?$to, ?$type) | Vzdialenosť sa vyžiadala cez distance() alebo distanceBetween(); každý argument zúži zhodu. |
assertNoDistanceRequested() | Nevyžiadala sa žiadna vzdialenosť. |
assertDatabaseUpdated(?string $edition) | Databáza MaxMind sa aktualizovala (pre danú edíciu) — nič sa nesťahuje. |
assertDatabaseNotUpdated() | Databáza sa neaktualizovala. |
assertForgotten($query) | forget() prebehol pre daný GeolocationQuery alebo DistanceQuery. |
assertNothingForgotten() | forget() neprebehol ani raz. |
assertCacheFlushed() | flushCache() prebehol aspoň raz. |
assertCacheNotFlushed() | flushCache() neprebehol ani raz. |
Fake nespúšťa žiadneho poskytovateľa, takže assertProviderUsed() overuje mená, ktoré váš kód pripol cez provider() / using() pre vyhľadávanie, dávku, vzdialenosť alebo maticu — nie to, ktorý poskytovateľ „by bol odpovedal“. Asercie zavoláte aj staticky na fasáde — Geolocation::assertLocated('8.8.8.8'). Vyhľadávania podľa súradníc majú kľúč „lat,lng“ v obyčajnom desatinnom zápise — „0.00001,0“, nikdy „1.0E-5,0“; Coordinates(1.0, 2.0) je 1,2. distanceMatrix() na fake vracia prázdnu mriežku a withToken() / withTimeout() / withConfig() nerobia nič.
Simulácia HTTP vrstvy
Ak chcete otestovať mapovanie odpovede skutočného poskytovateľa, pripnite pipeline a nasimulujte HTTP volanie:
use Illuminate\Support\Facades\Http;
it('maps an IPinfo response onto a Location', function () {
config()->set('geolocation.pipeline', ['ipinfo']);
Http::fake([
'ipinfo.io/*' => Http::response(['city' => 'Springfield', 'country' => 'US', 'loc' => '39.7817,-89.6501']),
]);
expect(Geolocation::locateIp('203.0.113.7')?->city)->toBe('Springfield');
});Simulácia limitera
RateLimits::fake() z http-client-rate-limits-for-laravel zaznamenáva spomaľovanie bez skutočného čakania, takže overíte, že sa limit poskytovateľa uplatnil:
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
it('paces bulk lookups under the ipinfo budget', function () {
config()->set('geolocation.pipeline', ['ipinfo']);
config()->set('geolocation.services.ipinfo.rate_limits.limit', 1);
$fake = RateLimits::fake(); // no real sleeping
Http::fake(['ipinfo.io/*' => Http::response(['city' => 'X', 'country' => 'US', 'loc' => '1,2'])]);
Geolocation::batch(['203.0.113.7', '198.51.100.4']);
$fake->assertDeferred('geolocation:ipinfo:app');
});Pracujete priamo na balíku? Jeho vlastné testy spustíte príkazom:
composer testPrejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.