Php 如何测试与微服务通信的控制器?

Php 如何测试与微服务通信的控制器?,php,laravel,unit-testing,lumen,Php,Laravel,Unit Testing,Lumen,我有下一个场景:我必须为控制器编写一些单元测试。在控制器中,我有所有类型的CRUD动作。问题是,在post/patch/delete操作中,我的api正在与一个web服务通信,我在其中传递一些数据。交流是用狂饮来完成的 问题:当我呼叫路线时,如何避免通信?是否有其他可能测试霍尔控制器 创建一个具有相同功能的示例类,但是如果您正在创建单元测试,并且不想让guzzle工作,那么您将测试什么 请仔细阅读文档,您将获得该选项 在我的建议中,您可以使用mocking。我假设您的微服务是在Laravel的服

我有下一个场景:我必须为控制器编写一些单元测试。在控制器中,我有所有类型的CRUD动作。问题是,在post/patch/delete操作中,我的api正在与一个web服务通信,我在其中传递一些数据。交流是用狂饮来完成的


问题:当我呼叫路线时,如何避免通信?是否有其他可能测试霍尔控制器

创建一个具有相同功能的示例类,但是如果您正在创建单元测试,并且不想让guzzle工作,那么您将测试什么

请仔细阅读文档,您将获得该选项


在我的建议中,您可以使用mocking。

我假设您的微服务是在Laravel的服务容器中注册的类。 据我所知,在Laravel中,您不能在容器外模拟类

因此,如果不这样做,请在
AppServiceProvider
类的容器中注册服务。并从控制器中的容器中获取微服务

在单元测试中,您可以根据需要为您的微服务创建一个模拟对象,并将其注入容器(替换真实的容器)。例如

$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();
}));
如果您在testcase类中使用mock方法会更容易,但它做的事情是一样的:

$this->mock(MyMicroService::class, function ($mock) {
    $mock->shouldReceive('contactRemoteServer')->once()->andReturnTrue();
});
更多示例

NB:如果您不知道,模拟类是专门为测试而创建的类,因此它不会影响结果,并且可以根据测试需要进行控制


例如,如果您想让microservice抛出异常,并且您想测试控制器的响应,那么您必须为每个单元测试创建一个模拟类

guzzle请求只是类的一小部分,所以我只想跳过它并测试其余部分