【发布时间】:2020-08-17 06:09:01
【问题描述】:
我有下一个场景:我必须为控制器编写一些单元测试。在控制器中,我有所有类型的 CRUD 操作。问题是,在发布/修补/删除操作中,我的 api 正在与我传递一些数据的 Web 服务进行通信。交流是用 guzzle 完成的。
问题:调用路由时如何避免通信?是否有其他可能测试大厅控制器?
【问题讨论】:
标签: php laravel unit-testing lumen
我有下一个场景:我必须为控制器编写一些单元测试。在控制器中,我有所有类型的 CRUD 操作。问题是,在发布/修补/删除操作中,我的 api 正在与我传递一些数据的 Web 服务进行通信。交流是用 guzzle 完成的。
问题:调用路由时如何避免通信?是否有其他可能测试大厅控制器?
【问题讨论】:
标签: php laravel unit-testing lumen
我假设你的微服务是一个注册在 Laravel 服务容器中的类。 据我所知,你不能在 Laravel 的容器之外模拟类。
所以,如果您不这样做,请在 AppServiceProvider 类的容器中注册服务。并从控制器See here for details中的容器中获取微服务。
在您的单元测试中,您可以根据自己的需要制作一个微服务的模拟对象并将其注入容器中(替换真实的)。例如。
$this->instance(MyMicroService::class, Mockery::mock(MyMicroService::class, function ($mock) {
// here you tell the mock object which method will be called and what to return and how many times it will be called. it's totally customizable.
$mock->shouldReceive('contactRemoteServer')->once()->andReturnTrue();
}));
如果你在测试用例类中使用 mock 方法会更容易,但它做同样的事情:
$this->mock(MyMicroService::class, function ($mock) {
$mock->shouldReceive('contactRemoteServer')->once()->andReturnTrue();
});
see the docs 获取更多示例。
注意:如果您不知道,模拟类是专门为测试而制作的类,因此它不会影响结果并且可以根据测试需要进行控制。
例如,如果您希望微服务会引发异常,并且您想测试控制器的响应,那么您必须为每个单元测试创建一个模拟类。
【讨论】:
创建一个具有相同功能的示例类,但我有一个问题,如果您正在创建单元测试并且您不想让 guzzle 工作,那么您将测试什么。
请仔细阅读文档,您将获得该选项。
在我的建议中,您可以使用模拟。
【讨论】: