Symfonyob娱乐下载 4.1中的新功能:更简单的服务测试
2018年3月20日·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
提供的
尼古拉斯Grekas
在# 26499.
在Syob娱乐下载mfony 3.4中默认情况下所有服务都是私有的也就是说你不能再打电话了$ this - > get(“my_service_id”)
在你的控制器中快速获得一些服务。
我们做这个更改是因为直接使用服务容器被认为不是一个好的实践:它隐藏了类的依赖关系,使它们与外部配置耦合,因此更难测试和检查。
每当我们删除一个这样的特性时,我们都会提供一个被认为更好的替代方案,如果可能的话,它和前一个一样简单。这就是控制器允许的原因使用类型提示注入服务在它们的动作方法和构造函数中。
“默认私有服务”的唯一缺点是测试比以前更难。一些开发人员甚至在测验
环境以在测试中公开所有服务。在Syob娱乐下载mfony 4.1中,我们做了同样的事情测试允许获取私有服务默认情况下。
在实践中,测试基于WebTestCase
而且KernelTestCase
现在访问一个特殊容器通过静态::$容器
属性,该属性允许获取未删除的私有服务:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用应用程序\实体\用户;使用ob娱乐下载\包\FrameworkBundle\测试\WebTestCase;使用ob娱乐下载\组件\控制台\测试人员\CommandTester;类AddUserCommandTest扩展WebTestCase{私人函数assertUserCreated(){自我::bootKernel ();//返回真实且不变的服务容器$容器=自我:: $内核->getContainer ();//获取允许获取私有服务的特殊容器$容器=自我:: $容器;$用户=自我:: $容器->get (“原则”)->getRepository(用户::类)->findOneByEmail (“……”);$这->assertTrue (自我:: $容器->get (“security.password_encoder”)->isPasswordValid ($用户,“……”);/ /……}
请记住,由于Symfony的服务容器的工作方式,将从容器中删除未使用ob娱乐下载的服务。这意味着,如果您有一个未被任何其他服务使用的私有服务,Symfony将删除它,您将无法获得本文所述的服务。ob娱乐下载解决方案是将服务定义为公共
这样Symfony就不会删除ob娱乐下载它。
发表在#生活在边缘
评论
我习惯于为更好的逻辑管理创建mock,并将我的测试集中在被链接的类上,但这是一个很好的特性。
只是为了了解,使用' setUp() '方法并调用我们的套件需要的所有服务,而不是在测试中直接调用它们,这不是一个更好的主意吗?
只是为了了解,使用' setUp() '方法并调用我们的套件需要的所有服务,而不是在测试中直接调用它们,这不是一个更好的主意吗?
克利斯朵夫Coevoet
2018年3月21日说在08:39
@Guillaume,这只是个人偏好的问题。如果在不同的测试之间没有什么要共享的,那么把东西放在测试中而不是放在setUp中就可以了。
马克斯Girkens
2018年3月21日说在09:40
啊,太好了——我真的不喜欢在测试环境中有一个单独的服务配置:)
沙利文SENECHAL
2018年3月21日说在34
看起来不错,但这不会让测试变弱吗?如何确保定义的服务在测试中不是公开的?
另外,你正在谈论“KernelTestCase”和“WebTestCase”上的“特殊容器”。如何在自定义测试用例中设置这个特殊的容器,例如,一个' KernelTestTrait ' ?
谢谢!: -)
另外,你正在谈论“KernelTestCase”和“WebTestCase”上的“特殊容器”。如何在自定义测试用例中设置这个特殊的容器,例如,一个' KernelTestTrait ' ?
谢谢!: -)
Yonel Ceruto
2018年3月21日说在14:13)
好消息!欧宝平台是合法的吗谢谢!
尼古拉斯Grekas
2018年3月22日说在16:31
@Sullivan这个特殊的容器也是一项名为“测试”的公共服务。Service_container”,这样你就可以在测试中任何有真正容器的地方使用它。
>如何确保测试中定义的服务不是公共的
真实的服务仍然获得真实的容器,因此它们不能访问私有服务。如果你在测试中需要真实的容器,你可以像往常一样通过内核访问真实的容器。
>如何确保测试中定义的服务不是公共的
真实的服务仍然获得真实的容器,因此它们不能访问私有服务。如果你在测试中需要真实的容器,你可以像往常一样通过内核访问真实的容器。
@Jérémi恐怕不会,因为Symfony总是在即将到来的版本(本例中是4.ob娱乐下载1)中添加新特性,而不是在现有版本中。
Smaine Milianni is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now