Я пишу небольшой API в Laravel, частично для целей изучения этого фреймворка. Я думаю, что обнаружил зияющую дыру в документах, но это может быть из-за того, что я не понимал «путь Ларавела», чтобы делать то, что я хочу.
Я пишу HTTP API, помимо прочего, для составления списка, создания и удаления системных пользователей на сервере Linux. Структура выглядит так:
- Маршруты к
/v1/users
соединяют GET
, POST
и DELETE
глаголов с методами контроллера get
, create
и delete
соответственно.
- Контроллер
App\Http\Controllers\UserController
фактически не выполняет системные вызовы, что выполняется службой App\Services\Users
.
- Служба создается ServiceProvider
App\Providers\Server\Users
, который регистрирует singleton
службы на отсроченной основе.
- Служба запускается Laravel автоматически и автоматически внедряется в конструктор контроллера.
ОК, так что все это работает. Я также написал некоторый тестовый код, например:
public function testGetUsers()
{
$response = $this->json('GET', '/v1/users');
/* @var $response \Illuminate\Http\JsonResponse */
$response
->assertStatus(200)
->assertJson(['ok' => true, ]);
}
Это тоже отлично работает. Тем не менее, здесь используются обычные привязки для UserService
, и я хочу вместо этого вставить макет / макет.
Я думаю, что мне нужно сменить мой UserService
на интерфейс, что легко, но я не уверен, как сказать базовой тестовой системе, что я хочу, чтобы она запускала мой контроллер, но с нестандартной службой. Я вижу, что App::bind()
появляется в ответах Stack Overflow при исследовании этого, но App
не входит в область действия автоматически в тестах, созданных ремесленниками, так что это похоже на сцепление с соломой.
Как я могу создать фиктивную службу и затем отправить ее в Laravel при тестировании, чтобы он не использовал вместо этого стандартный ServiceProvider?