Queue::fake не работает с модулем кодирования Laravel5

Я пишу тест для приложения 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, когда в тесте делается более одного запроса?


person Log    schedule 25.03.2020    source источник
comment
Если вы можете понять, как это исправить, отправьте запрос на вытягивание на github.com/Codeception/module-laravel5.   -  person Naktibalda    schedule 25.03.2020


Ответы (1)


Я не уверен, почему модуль Laravel делает это, но я нашел обходной путь, который позволяет вам использовать подделки:

public function someTest(ApiTester $I): void
{
    // what the SomeFacade::fake method call does is basically create
    // a fake object and swaps it for the original implementation in 
    // the app container, so the we're recreating that behavior here
    // only this will be persisted even after the request is issued:
    $notification_fake = new NotificationFake();
    // `haveInstance` is a method from Laravel Codeception Module 
    // which sets an object in the app container for you:
    $I->haveInstance(ChannelManager::class, $notification_fake);

    // making the request
    $I->sendPUT('some url', $some_payload);

    // assertions
    $I->canSeeResponseCodeIs(Response::HTTP_OK);
    $notification_fake->assertSentToTimes($expected_user, MyNotification::class, 1);
}

обратите внимание, что этот метод тестирования предназначен только для иллюстративных целей и упускает из виду детали, следовательно, неопределенные переменные и тому подобное.

Также обратите внимание, что я использую поддельные уведомления, которые регистрируются в Illuminate\Notifications\ChannelManager, в отличие от большинства подделок, которые вы можете зарегистрировать под псевдонимом, например. queue. Таким образом, вы должны проверить, что создается, и как поменять его местами самостоятельно. Вы можете найти это у соответствующих поставщиков услуг для каждой услуги. Большую часть времени это название фасада в нижнем регистре.

person guessimtoolate    schedule 22.05.2020