【发布时间】:2018-10-20 02:45:45
【问题描述】:
我正在 Laravel 中编写一个小型 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 来代替?
【问题讨论】:
-
为什么要测试服务商?服务提供者有两个函数
boot()和register(),有什么要测试的。它都在 Laravel 测试中进行了测试。您需要测试服务提供者实例化的类。 -
@Kyslik:我不想测试服务提供商(或服务)。我只想将服务换成虚拟服务,这样我就可以使用虚拟服务测试系统(在这种情况下使用真实服务将使其成为集成测试,我只想要一个独立的功能测试)。
标签: php laravel laravel-5 mocking phpunit