Метод fake
Метод fake класса Bus применяется в тестах Laravel для создания фейковой реализации диспетчера шины. Он позволяет перехватывать все команды, отправляемые через шину, и проверять их, не выполняя реальную логику. Метод возвращает экземпляр фейкового диспетчера, с помощью которого можно делать утверждения о том, какие команды были отправлены.
Синтаксис
<?php
Bus::fake();
?>
Метод не принимает параметров и возвращает экземпляр фейкового диспетчера.
Пример
Давайте протестируем контроллер, который отправляет команду на создание пользователя через шину:
<?php
namespace AppHttpControllers;
use AppJobsCreateUserJob;
use IlluminateSupportFacadesBus;
class UserController extends Controller
{
public function store(Request $request)
{
$job = new CreateUserJob($request->all());
Bus::dispatch($job);
return response()->json(['message' => 'User created']);
}
}
?>
<?php
namespace TestsUnit;
use AppJobsCreateUserJob;
use AppHttpControllersUserController;
use IlluminateFoundationTestingTestCase;
use IlluminateSupportFacadesBus;
use IlluminateHttpRequest;
class UserControllerTest extends TestCase
{
public function test_store_dispatches_create_user_job()
{
Bus::fake();
$controller = new UserController();
$request = new Request(['name' => 'John', 'email' => 'john@example.com']);
$response = $controller->store($request);
Bus::assertDispatched(CreateUserJob::class);
$this->assertEquals(200, $response->status());
}
}
?>
Результат выполнения кода:
"Test passed: CreateUserJob was dispatched"
Пример
Давайте проверим, что команда была отправлена с правильными данными:
<?php
namespace TestsUnit;
use AppJobsCreateUserJob;
use AppHttpControllersUserController;
use IlluminateFoundationTestingTestCase;
use IlluminateSupportFacadesBus;
use IlluminateHttpRequest;
class UserControllerTest extends TestCase
{
public function test_store_dispatches_job_with_correct_data()
{
Bus::fake();
$controller = new UserController();
$data = ['name' => 'Jane', 'email' => 'jane@example.com'];
$request = new Request($data);
$response = $controller->store($request);
Bus::assertDispatched(function (CreateUserJob $job) use ($data) {
return $job->userData === $data;
});
$this->assertEquals(200, $response->status());
}
}
?>
Результат выполнения кода:
"Test passed: job data matches expected values"
Пример
Давайте проверим, что команда не была отправлена более одного раза:
<?php
namespace TestsUnit;
use AppJobsCreateUserJob;
use AppHttpControllersUserController;
use IlluminateFoundationTestingTestCase;
use IlluminateSupportFacadesBus;
use IlluminateHttpRequest;
class UserControllerTest extends TestCase
{
public function test_store_dispatches_job_only_once()
{
Bus::fake();
$controller = new UserController();
$request = new Request(['name' => 'Bob', 'email' => 'bob@example.com']);
$controller->store($request);
Bus::assertDispatched(CreateUserJob::class, 1);
$this->assertTrue(true);
}
}
?>
Результат выполнения кода:
"Test passed: job dispatched exactly once"
Смотрите также
-
метод
assertDispatched,
который проверяет, была ли отправлена команда -
метод
fakeклассаQueue,
который подменяет очередь в тестах -
метод
fakeклассаEvent,
который подменяет диспетчер событий в тестах -
метод
fakeклассаMail,
который подменяет почтовый сервис в тестах