composer require --dev eventsauce/pest-utilities
First, create a base test case, as described in the regular PHPUnit setup.
Next, use the base test case in your Pest tests:
use function EventSauce\EventSourcing\PestTooling\expectToFail;
use function EventSauce\EventSourcing\PestTooling\given;
use function EventSauce\EventSourcing\PestTooling\nothingShouldHaveHappened;
use function EventSauce\EventSourcing\PestTooling\when;
uses(YourBaseTestCase::class);
it('you can use the object-oriented interface', function () {
$this->given(
new ShoppingCartInitiated(),
)->when(function (ShoppingCart $cart): void {
$cart->addProduct(new ProductId('garlic sauce'), 250);
})->then(
new ProductAddedToCart(new ProductId('garlic sauce'), 250)
);
});
it('or the function based interface', function () {
given(new ShoppingCartInitiated());
when(function (ShoppingCart $cart): void {
$cart->checkout();
});
expectToFail(SorryCantCheckout::becauseThereAreNoProductsInCart());
nothingShouldHaveHappened();
});
it('or mix it all', function () {
given(new ShoppingCartInitiated())
->when(function (ShoppingCart $cart): void {
$cart->checkout();
});
expectToFail(SorryCantCheckout::becauseThereAreNoProductsInCart())
->nothingShouldHaveHappened();
});
it('can be used in a compact manner')
->given(new ShoppingCartInitiated())
->when(fn (ShoppingCart $cart) => $cart->add(new ProductId('garlic sauce'), 250))
->then(new ProductAddedToCart(new ProductId('garlic sauce'), 250))
->assertScenario(); // needed for a Pest bug