---
title: "Testovanie — HTTP Client Rate Limits for Laravel | Roundly"
description: "Nahraďte manager cez RateLimits::fake() a overujte odložené, povolené aj vynulované limity bez čakania a Redisu, alebo použite fake Sleep."
url: https://roundly-consulting.com/sk/open-source/navody/http-client-rate-limits-for-laravel/testovanie
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[HTTP Client Rate Limits for Laravel](https://roundly-consulting.com/sk/open-source/navody/http-client-rate-limits-for-laravel.md)

# Testovanie

RateLimits::fake() nahradí manager zaznamenávajúcim fake, aby testy mohli overovať obmedzenie bez skutočného čakania a bez Redisu:

```php
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(). Udalosti limitov, ktoré fake vytvorí, zaznamenáva priamo, nie cez dispatcher udalostí, takže ich Event::fake() — zapnutý pred ním aj po ňom — neskryje.

## 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(). |

```php
// 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();        // int
```

## Kompletný test

```php
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. Zároveň sleduje testovací čas Carbonu, takže po travel() za koniec okna ďalšia požiadavka prejde hneď.
- Počas fake sú udalosti vždy zapnuté bez ohľadu na events\_enabled a fake ich aj počúva — zaznamená tak aj limit vytvorený pred jeho nasadením (každú udalosť raz).
- 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:

```php
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 sleeping
```

## Prejavte 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 kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/http-client-rate-limits-for-laravel.md)
