NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

Exchange::fake($rates, $pivot) nasadí statické kurzy — bez HTTP, bez cache — pre fasádu, injektovaný ExchangeManager aj Money::convertTo() a vráti fake, na ktorom overujete:

use RoundlyConsulting\Money\Facades\Exchange;
use RoundlyConsulting\Money\Money;

it('converts the order total to dollars', function () {
    $fake = Exchange::fake(['EUR/USD' => '1.0854']);

    $usd = Money::ofMajor('10', 'EUR')->convertTo('USD');

    expect($usd->equals(Money::ofMajor('10.85', 'USD')))->toBeTrue();
    $fake->assertRateRequested('EUR', 'USD');
});

it('never asks for a rate within one currency', function () {
    $fake = Exchange::fake();

    Money::ofMajor('10', 'EUR')->convertTo('EUR');

    $fake->assertNothingRequested();
});

Money::convertTo(), MoneyBag::total() aj každý neskôr vytvorený prevodník použijú fake. Chýbajúce páry sa invertujú alebo triangulujú cez pivot; inak ExchangeRateUnavailable. Kurzy môžete zadať aj podľa základnej meny: ['EUR' => ['USD' => '1.0854']].

Tabuľka kurzov sa zaznamenáva, nezapisuje

Pod fake Exchange::rates() len zaznamenáva — nič nesťahuje, nezapisuje, nezaraďuje do fronty ani nemaže — a rovnako aj príkazy money:rates:refresh a money:rates:prune. source() a extend() sa správajú ako skutočný manažér, takže surový zdroj ecb stále sťahuje; spojte ho s Http::fake(). Neznáma metóda vyhodí BadMethodCallException.

use RoundlyConsulting\Money\Facades\Exchange;

it('stores the manual CZK rate', function () {
    $fake = Exchange::fake();

    Exchange::rates()->manual('EUR', 'CZK', '25.10');   // recorded — nothing is written

    $fake->assertStored('EUR', 'CZK', '25.10', 'manual');
    $fake->assertNothingRefreshed();
});

Všetky asercie

use RoundlyConsulting\Money\Enums\EcbFeed;

$fake = Exchange::fake(['EUR/USD' => '1.0854']);

// ... code that converts, refreshes, stores or prunes ...

$fake->assertRateRequested('EUR', 'USD');             // rate() was asked for the pair — conversions included
$fake->assertRefreshed('ecb', EcbFeed::Daily);        // rates()->refresh() ran — source and feed optional
$fake->assertRefreshQueued('ecb');                    // rates()->refreshLater() ran — source and feed optional
$fake->assertStored('EUR', 'CZK', '25.10', 'manual'); // store() or manual() got the pair — rate and source optional
$fake->assertPruned($before);                         // rates()->prune() ran — cut-off day optional

// each has a twin that passes when nothing happened
$fake->assertNothingRequested();
$fake->assertNothingRefreshed();
$fake->assertNothingQueued();
$fake->assertNothingStored();
$fake->assertNothingPruned();

Exchange::rates()->assertStored('EUR', 'CZK');        // the rates-table asserts also live on the faked rates()
AserciaPrejde, keďOpak
assertRateRequested($from, $to)rate() bol požiadaný o pár — vrátane prevodov.assertNothingRequested()
assertRefreshed(?$source, ?$feed)rates()->refresh() prebehol, voliteľne pre daný zdroj a feed.assertNothingRefreshed()
assertRefreshQueued(?$source, ?$feed)rates()->refreshLater() prebehol.assertNothingQueued()
assertStored($from, $to, ?$rate, ?$source)store() alebo manual() dostal kurz pre pár; kurz sa porovnáva presne.assertNothingStored()
assertPruned(?$before)rates()->prune() prebehol, voliteľne s týmto hraničným dňom.assertNothingPruned()

Currencies nemá fake: register je v pamäti a deterministický.

Naplnenie dát a simulácia zdrojov

use Illuminate\Support\Facades\Http;
use RoundlyConsulting\Money\Models\CurrencyRate;

// Seed the rates table for the database driver (run the published migration in your test setup)
CurrencyRate::factory()->pair('EUR', 'USD', '1.10')->on('2026-09-25')->from('ecb')->create();

// Fake the ECB feed for the ecb driver
Http::fake(['*eurofxref-daily.xml' => Http::response($xml)]);

Tipy

  • Sumy vytvárajte cez ofMinor() alebo ofMajor() a overujte cez equals() alebo minor() — obe sú presné.
  • Pre presné porovnanie formátovaného výstupu použite decimal formátovač; pri intl normalizujte medzery — verzie ICU zamieňajú NBSP a NNBSP.
  • V testoch kurzov zmrazte čas cez CarbonImmutable::setTestNow() — vyhľadávanie bez dátumu berie „dnes“ v money.exchange.timezone.
<!-- phpunit.xml — byte-exact formatting on every machine -->
<php>
    <env name="MONEY_FORMATTER" value="decimal"/>
</php>

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

Odoslaní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.