RateLimits::fake() nahradí manager zaznamenávajúcim fake, aby testy mohli overovať obmedzenie bez skutočného čakania a bez Redisu:
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
$fake = RateLimits::fake();
Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/one');
Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/two');
$fake->assertDeferred('acct-1'); // a request for this key was throttled
$fake->assertAllowed(); // at least one request went through
// $fake->assertNothingDeferred(); // would fail here
RateLimits::perMinute(60)->by('stripe')->reset();
$fake->assertReset('stripe');fake() vráti RateLimitsFake — podtyp RateLimitManager vložený do kontajnera, takže ho dostane fasáda, injektovaný manager aj Http::rateLimit(). Limiter naďalej beží: pokusy sa počítajú a čakania vypočítajú, ale nič nečaká a Redis sa nepoužije. Požiadavky sa stále odosielajú, preto ho kombinujte s Http::fake().
Všetky asercie
| Metóda | Overí / vráti |
|---|---|
assertDeferred(?string $key = null) | Niektorá požiadavka bola odložená — pri zadanom kľúči práve pre tohto vlastníka. |
assertNothingDeferred() | Žiadna požiadavka nebola odložená. |
assertAllowed(?string $key = null) | Niektorá požiadavka bola povolená — pri zadanom kľúči práve pre tohto vlastníka. |
assertNothingAllowed() | Žiadna požiadavka nebola povolená. |
assertReset(?string $key = null) | Niektorý limit bol vynulovaný — pri zadanom kľúči práve pre tohto vlastníka. |
assertNothingReset() | Žiaden limit nebol vynulovaný. |
deferredCount() / allowedCount() | Počet odložených / povolených požiadaviek. |
store() | Zdieľaný InMemoryStore; pokusy čítajte podľa kľúča úložiska, napr. hits('acct-1:minute'). |
deferrer() | RecordingDeferrer: defers() a deferCount(). |
// Every assertion returns the fake, so they chain.
$fake->assertDeferred(); // some request was deferred
$fake->assertDeferred('acct-1'); // … for this owner key
$fake->assertNothingDeferred(); // no request was deferred
$fake->assertAllowed(); // some request was allowed
$fake->assertAllowed('acct-1'); // … for this owner key
$fake->assertNothingAllowed(); // no request went through
$fake->assertReset(); // some limit was reset
$fake->assertReset('stripe'); // … for this owner key
$fake->assertNothingReset(); // nothing was reset
$fake->deferredCount(); // int
$fake->allowedCount(); // int
$fake->store()->hits('acct-1:minute'); // hits recorded for a key + window
$fake->deferrer()->defers(); // every wait in ms, e.g. [60000]
$fake->deferrer()->deferCount(); // intKompletný test
use Illuminate\Support\Facades\Http;
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
it('throttles the second call for the same account', function () {
Http::fake(['*' => Http::response('ok')]);
$fake = RateLimits::fake();
Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/one');
Http::rateLimit(1, by: 'acct-1')->get('https://api.example.com/two');
$fake->assertAllowed('acct-1')->assertDeferred('acct-1');
expect($fake->deferredCount())->toBe(1)
->and($fake->allowedCount())->toBe(2)
->and($fake->deferrer()->defers())->toBe([60_000]); // one full minute
});- Všetky limity vytvorené počas aktívneho fake zdieľajú jeden InMemoryStore a jeden RecordingDeferrer — samostatné volania Http::rateLimit() s rovnakým kľúčom a oknom teda zdieľajú limit.
- RateLimits::usingStore(), usingDeferrer() a releasingJob() platia aj pod fake: vrátia manager s vaším prepisom, ktorý si pre druhú polovicu ponechá zaznamenávajúce úložisko alebo deferrer z fake — vrátená úloha sa teda naozaj vráti do fronty a jej udalosti fake aj tak zaznamená.
- RecordingDeferrer nikdy nečaká: každé čakanie zaznamená (defers(), deferCount()) a posunie vlastné hodiny, takže okná postupujú deterministicky.
- Počas fake sú udalosti vždy zapnuté bez ohľadu na events_enabled — asercie na nich stavajú.
- Kombinujte s Http::fake(), aby z testu neodišla žiadna skutočná požiadavka.
Fake Sleep namiesto toho
Ak chcete ponechať skutočný limiter a len preskočiť čakanie, použite fake Sleep od Laravelu — predvolený SleepDeferrer čaká práve cez neho:
use Illuminate\Support\Sleep;
use RoundlyConsulting\HttpClientRateLimits\Facades\RateLimits;
Sleep::fake();
$limit = RateLimits::perSecond(1);
Http::withMiddleware($limit)->get('https://api.example.com/one');
Http::withMiddleware($limit)->get('https://api.example.com/two');
Sleep::assertSleptTimes(1); // the SleepDeferrer paused once, without really sleepingPrejavte 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.