Я пишу тест для приложения Laravel с codeception и модулями Laravel5, REST.
Один из тестов API:
public function testEmailRegistration(ApiTester $I) {
...
// Not correct data
$I->sendPOST($route, [
'first_name' => (string)$this->faker->randomNumber(),
'password' => $this->faker->password(1, 7),
'email' => 'not_valid_email',
]);
$I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
// Correct data
\Illuminate\Support\Facades\Queue::fake();
$I->sendPOST($route, [
'first_name' => $firstName,
'password' => $password,
'email' => $email,
]);
\Illuminate\Support\Facades\Queue::assertPushed(\App\Jobs\SendEmail::class);
...
}
Я отправляю запросы на неверные и правильные данные и делаю некоторые утверждения. Дополнительно проверяю, есть ли задание в очереди.
После выполнения теста я выдаю ошибку:
[Error] Call to undefined method Illuminate\Queue\SyncQueue::assertPushed()
После Queue:fake фасад \Illuminate\Support\Facades\Queue должен преобразоваться в QueueFake, но на самом деле это все еще QueueManager, поэтому функция assertPushed не определена.
Выполнение $I->sendPOST() вызова сброса Queue::fake. Это произошло в модуле laravel 5 \Codeception\Lib\Connector\Laravel5, метод doRequest.
protected function doRequest($request)
{
if (!$this->firstRequest) {
$this->initialize($request);
}
$this->firstRequest = false;
$this->applyBindings();
$this->applyContextualBindings();
$this->applyInstances();
$this->applyApplicationHandlers();
$request = Request::createFromBase($request);
$response = $this->kernel->handle($request);
$this->app->make('Illuminate\Contracts\Http\Kernel')->terminate($request, $response);
return $response;
}
Каждый вызов doRequest, кроме первого приложения инициализации, и некоторые конфигурации, такие как Queue::fake, очищаются.
Одним из решений является один запрос на тест. Есть ли другой вариант работы Queue::fake, когда в тесте делается более одного запроса?