timacdonald/callable-fake
A tiny PHP testing utility for faking/invoking callables. CallableFake lets you replace closures or invokable objects, record calls and arguments, assert usage, and return configured values—useful for isolating behavior in PHPUnit/Laravel tests.
App\Services\*).Event::listen() or Observer::observing().Route::get(..., fn() => ...)).bind(fn() => ...)).Mockery or PHPUnit mocks). Best used for closure-specific assertions.beforeEach resets).Mockery) or supplement it? (Answer: Supplement for closure-specific cases.)partialMock() or Mockery handle this? (Only if testing objects, not pure closures.)assertCalledIndex) beyond basic mocking?bindWith(fn() => new Service())).Event::listen(fn($event) => ...)).Route::get(..., fn() => ...)).Closure::fromCallable([$middleware, 'handle'])).grep -r "fn(" or IDE search).CallableFake to validate ROI.// Before: Manual assertion
$listenerCalled = false;
Event::listen(fn() => $listenerCalled = true);
// ... trigger event ...
$this->assertTrue($listenerCalled);
// After: CallableFake
$fake = new CallableFake();
Event::listen($fake);
// ... trigger event ...
$fake->assertCalled();
use CallableFake.composer.json dev dependencies:
"require-dev": {
"timacdonald/callable-fake": "^1.9"
}
composer.json and run tests to ensure no conflicts.CallableFake.CallableFake for event listeners").assertCalled()).fake, assertCalled, assertCalledWith).| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Closure reused across tests | Flaky assertions | Reset fakes in beforeEach or use unique instances. |
| PHPUnit version mismatch | Tests fail to run | Pin to compatible version in composer.json. |
| Overuse in performance-critical tests | Slower test suite | Reserve for high-value assertions. |
| Package abandonment | Unmaintained | Monitor GitHub activity; fork if needed. |
CallableFake.assertCalledWith for argument validation)./** @test */
public function event_listener_is_called()
{
$fake = new CallableFake();
Event::listen($fake);
// Trigger event...
event(new MyEvent());
$fake->assertCalled();
$fake->assertCalledWith([$expectedArg]);
}
How can I help you explore Laravel packages today?