我刚刚开始在symfony框架的上下文中编写测试,我想知道什么时候只使用TestCase类而不是KernelTestCase.

简单介绍一下上下文:我需要测试由控制器调用的定制服务.所有的业务逻辑都在我的服务中.

我有用于CRUD操作的方法,其他用于发送邮箱等.

我需要知道什么时候使用TestCase而不是KernelTestCase,因为我看到的主要区别是使用KernelTestCase可以调用容器而不是实例化您的服务,那么什么时候TestCase比KernelTestCase更合适,反之亦然?

官方文件称:

集成测试将测试应用程序的更大部分 与单元测试(例如,服务的组合)相比.整合 测试可能希望使用symfony内核从 依赖项注入容器.

那么,这是否意味着如果我有一个使用许多其他服务的服务,我需要使用KernelTestCase?如果是这样的话,与KernelTestCase一起使用而不是TestCase又有什么不同呢?

希望我说清楚了.

推荐答案

那么,这是否意味着如果我有一个使用许多其他服务的服务,我需要使用KernelTestCase?

不一定!

通过使用TestCase(从PHPUnit开始),您可以轻松地模拟依赖项(通过扩展它们来实例化伪对象),甚至可以对它们的方法调用进行预期:

$dependency = self::createMock(MyDependencyService::class);
$dependency->expects(self::once())->method('someMethodName');

$service = new Service($dependency);
$service->testedMethod();

在这里,我们希望$dependency模拟对象的someMethodName()方法被调用一次.如果不是,测试将失败.您可以对参数进行更复杂的断言并定义返回值.

使用KernelTestCase(从Symfony),您可以访问service container中的服务.当您真正需要的是服务而不是实际上不做任何事情的模拟对象时,这非常有用.
例如,您可以请求103将一些JSON输入转换为DTO:

$serializer = self::getContainer()->get(SerializerInterface::class);
$service = new Service($serializer);

在某些情况下,您甚至可以从服务容器中获取完全配置的服务,或者在执行此操作之前替换容器中的服务.
请注意,使用KernelTestCase并不意味着在每个测试中都使用测试服务容器,您可能只在一个测试中需要它.

这实际上取决于您想要测试的行为和服务的依赖关系.如果您需要获得真正的服务来测试您自己无法实例化的定制服务,那么使用KernelTestCase,但是如果您可以避免它(使用Kernelservice container会降低您的测试套件的速度),那么使用TestCase并使用mock objects.

Php相关问答推荐

我如何知道BaseController中当前运行的是哪个控制器?

在函数内部获取一致的单选按钮值以更新WordPress用户数据

Mysqli_stmt::Execute():结果字段元数据中存在过早的EOF

使用PHP和WebSockets或SSE实现实时通知

WooCommerce:在 checkout 审核单和发票中显示定制产品数据

为什么只有最后一次点击的点赞/心形会按预期改变 colored颜色 ,而其他的保持正常 colored颜色 ?

可以';exec、system和shell_exec PHP函数中的命令字符串上的字符数不得超过8175

如何在其他数组php中创建具有关联数组的数组

使用简码在 WooCommerce 我的帐户中显示一些用户数据

对产品/库存结果集进行分组和计数,形成多维分层数组

有没有办法获取触发流操作的页面的 URI?

AWS S3:当对象名称包含 % 时复制对象失败并出现错误 - 无效的复制源编码

如何在 php 中获取正确的时间

图像未在 Laravel Ajax Crud 中显示

htaccess php 文件,然后是文件夹

适当的时区处理 Laravel / Carbon

如何为多个表的id列设置不同的值

用于多态服务的 Symfony setter 注入

如何简化 php API 中的格式化数组列表数据以提供 React Native 部分列表

如何在不复制的情况下在php中重新索引数组