Laravel насмешка не выполняется - PullRequest
0 голосов
/ 26 февраля 2020

Я слишком пытался смоделировать класс обслуживания в моем модульном тестировании Laravel 6, но вызов переходит к реальному методу, а не к поддельному ответу. Вот класс People, который я пытаюсь смоделировать -

class People
{ 
    public static function checkCredentials($username, $password) {
        // some code, which is not supposed to execute while unit testing. 
    }
}

Контроллер, ответственный за выполнение этого, -

class AuthController extends Controller {
    public function login(Request $request) {
        $auth = People::checkCredentials($request->username, $request->password);
        dd($auth);  // I am expecting mocked response here i.e., ['abc'].
    }
}

Вот мой тестовый класс -

class LoginTest extends TestCase {
    /** @test */
    public function a_user_can_login() {
         $this->mock(People::class, function ($mock) {
            $mock->shouldReceive('checkCredentials')
                    ->withArgs(['username', 'password'])
                    ->once()
                    ->andReturn(['abc']);
        });
        $this->assertTrue(true);
    }
}

Дамп в контроллере возвращает реальный ответ, а не поддельный. Мне нужна помощь, чтобы понять, что я делаю неправильно. Благодаря.

1 Ответ

1 голос
/ 26 февраля 2020

Чтобы смоделировать сервис, сервис должен быть внедрен как контейнер сервиса.

В данный момент вы вызываете метод stati c класса People без создания экземпляра класса .

$auth = People::checkCredentials($request->username, $request->password);

Попробуйте внедрить класс в качестве сервисного контейнера, чтобы Laravel мог поймать инъекцию и издеваться над ней. Вы можете ввести подсказку в качестве параметра вашей функции.

class AuthController extends Controller {
    public function login(Request $request, $people People) {
        $auth = $people::checkCredentials($request->username, $request->password);
        dd($auth);  // I am expecting mocked response here i.e., ['abc'].
    }
}

Пересмешивать объекты

Служебный контейнер

...