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

时间:2020-05-02 18:54:04

标签: php laravel unit-testing lumen

我有下一个场景:我必须为控制器编写一些单元测试。在控制器中,我具有所有类型的CRUD动作。问题是在发布/修补/删除操作中,我的api正在与Web服务进行通信,并在其中传递一些数据。沟通非常耗时。

问题:拨打路线时如何避免通讯?还有其他测试霍尔控制器的可能性吗?

2 个答案:

答案 0 :(得分:1)

我假设您的微服务是在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();
}));

并且如果在测试用例类中使用模拟方法会更容易,但它具有相同的作用:

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

see the docs了解更多示例。

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

例如,如果您希望微服务将引发异常,并且要测试控制器的响应,则必须为每个单元测试创​​建一个模拟类。

答案 1 :(得分:0)

创建具有相同功能的示例类,但是我有一个问题,如果您要创建单元测试,并且不想使这个工作变得如此困难,那么您将测试什么。

请仔细阅读文档,您将获得选择。

在我的建议下,您可以使用模拟。

相关问题