Как имитировать аутентификацию API в модульном тестировании laravel - PullRequest
0 голосов
/ 08 мая 2020

enter code here Я вызываю службу, которая требует аутентификации, для этого я использовал черту без промежуточного программного обеспечения,

$user = new User([
            'id' => 1,
            'eos_id' => '832355',
            'user_name' => 'yish',
            'email_id' => 'test@test.com'
        ]);
        $this->actingAs($user, 'api'); 

после этого, когда я проверяю как auth ('api') -> check () это всегда возвращает false.

EDIT

Метод COntroller, который я хочу протестировать

public function destroy($id)
    {
        try {
            $deleted = $this->wareHouseService->deleteWareHouse($id, auth('api')->user()->getAuthIdentifier());
        } catch (\Exception $e) {
            $errors = [$e->getMessage()];
            if ($e instanceof ValidationException) {
                $errors = Arr::first(array_values($e->errors()));
            }
            return (new ErrorResource(collect($errors)))
                ->response()
                ->setStatusCode(422);
        }
}

Метод тестирования

public function test_destroy_warehoue () {

    $user = new User([
            'id' => 1,
            'whr_id' => '832355',
            'user_name' => 'yish',
            'email_id' => 'test@test.com'
        ]);

        $this->actingAs($user, 'api');

    $this->mockWareHouseService->shouldReceive('destroy')
            ->with(619, auth('api')->user()->getAuthIdentifier())
            ->andReturn(true);
    $actualData = $this->mockWareHouseController->destroy(619);

}

Здесь auth ('api' ) -> user () -> getAuthIdentifier () всегда возвращает значение null.

1 Ответ

0 голосов
/ 08 мая 2020

В вашем методе тестирования вам нужно имитировать класс Auth так же, как вы имитируете свой wareHouseService. Когда вызывается пользователь (после охранника), он должен вернуть вашего пользователя. Это будет примерно так:

$user = factory(User::class)->create(['id' => 2]);
Auth::shouldReceive('guard')->once()->with('api')->andReturnSelf();
Auth::shouldReceive('user')->once()->andReturn($user);
...