我有下一个场景:我必须为控制器编写一些单元测试。在控制器中,我具有所有类型的CRUD动作。问题是在发布/修补/删除操作中,我的api正在与Web服务进行通信,并在其中传递一些数据。沟通非常耗时。
问题:拨打路线时如何避免通讯?还有其他测试霍尔控制器的可能性吗?
答案 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)
创建具有相同功能的示例类,但是我有一个问题,如果您要创建单元测试,并且不想使这个工作变得如此困难,那么您将测试什么。
请仔细阅读文档,您将获得选择。
在我的建议下,您可以使用模拟。