Testing
The main goal is to prevent using Mockery and implement real mocks that conforms interface of your actions / queries / etc.
It makes it harder to manage the code but will make your test more type safe, easy to refactor and analyze.
You can check this article testing without mocking frameworks.
HTTP/s
For HTTP/s we are using package that implements Psr\Http\Client\ClientInterface and Psr\Http\Message\RequestFactoryInterface
and we need to correctly test them.
Install
composer require php-http/mock-client
Usage
Use the mock client and then use your current PSR-17 compatible request factory (no need for "mocked" implementation).
$this->client = new \Http\Mock\Client();
$this->requestFactory = new \Nyholm\Psr7\Factory\Psr17Factory;();
// Add responses that will be used.
$this->client
->addResponse($this->requestFactory->createResponse(404));
// With HTML content
$response = $this->requestFactory
->createResponse()
->withBody(\Nyholm\Psr7\Stream::create($html));
For more client usage examples check php-http/mock-client docs
Laravel Application
We can provide our implementation of \Illuminate\Contracts\Foundation\Application and \Illuminate\Contracts\Container\Container
to test our logic without Laravel being booted by using \LaraStrict\Testing\Laravel\TestingApplication.
Check the code for current state of implementation.
Make
We can make objects for app->make() calls by providing closure that will build the dependency.
$app = new TestingApplication();
$app->makeReturns(
abstract: GetMetaDataForUrlPageAction::class,
make: fn () => new GetMetaDataForUrlPageAction(
httpClient: new ClientMock(),
requestFactory: new RequestFactory()
)
);