Testovanie
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()| Asercia | Prejde, 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 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.