Reusable PSR-compliant test doubles for PHP — drop-in fakes for HTTP clients, loggers, and SOAP clients with a fluent matcher API and descriptive failure messages.
- PHP 8.3+
ext-soap(only required when usingTestSoapClient)
composer require --dev eventjet/test-double| Class | Implements | Documentation |
|---|---|---|
TestLogger |
PSR-3 LoggerInterface |
doc/TestLogger.md |
TestHttpClient |
PSR-18 ClientInterface |
doc/TestHttpClient.md |
TestSoapClient |
Custom SOAP client | doc/TestSoapClient.md |
Reusable matchers (Str::regex(), Val::eq()) are documented in doc/Matchers.md.
use Eventjet\TestDouble\TestLogger;
use PHPUnit\Framework\TestCase;
use Psr\Log\LogLevel;
final class MyServiceTest extends TestCase
{
public function testLogsWarningOnFailure(): void
{
$logger = new TestLogger();
$service = new MyService($logger);
$service->doSomething();
$result = $logger->once(
TestLogger::and(
TestLogger::level(LogLevel::WARNING),
TestLogger::message('Operation failed')
)
);
self::assertTrue($result);
}
}use Eventjet\TestDouble\TestHttpClient;
use GuzzleHttp\Psr7\HttpFactory;
use PHPUnit\Framework\TestCase;
final class MyApiClientTest extends TestCase
{
public function testFetchesUser(): void
{
$factory = new HttpFactory();
$httpClient = new TestHttpClient();
$httpClient->map(
TestHttpClient::path('/api/users/1'),
$factory->createResponse(200)->withBody(
$factory->createStream('{"id":1,"name":"John"}')
)
);
$apiClient = new MyApiClient($httpClient);
$user = $apiClient->getUser(1);
self::assertSame('John', $user->name);
}
}MIT — see LICENSE.