我有一个Symfony2服务,使用依赖注入使用config.yml中的参数构建。我现在正在尝试对其进行单元测试,并发现单元测试无法访问容器,因此无法访问服务。所以我应该使用模拟数据自己构建一个。如果我现在可以读取config参数(首先是config_test.yml然后是config.yml等等),这对我来说是有意义的,但似乎也不可能。这似乎使单元测试服务变得很麻烦,因为我需要将初始化参数编码到测试而不是配置文件中。
如果在单元测试期间确实无法使用config.yml中的参数构建服务,是否有人知道它为什么是Bad Thing™的逻辑?
答案 0 :(得分:11)
这对我有用:
class MyServiceTest extends WebTestCase
{
public function testCookies()
{
$client = static::createClient();
$myParams = $client->getKernel()->getContainer()->getParameter('my_params');
}
}
答案 1 :(得分:6)
我找到了这篇文章,因为我自己在测试中需要配置参数。这是谷歌的第一次热播。
然而,这是一个有效的解决方案。可能会有更好的。
<?php
...
require_once(__DIR__ . "/../../../../../app/AppKernel.php");
class MediaImageTest extends WebTestCase
{
private $_application;
private $storagePath;
public function setUp() {
$kernel = new \AppKernel('test', true);
$kernel->boot();
$this->_application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
$this->_application->setAutoExit(false)
$this->storagePath = $this->_application->getKernel()->getContainer()->getParameter('media_path');
}
...
}
你也可以这样看:Access Symfony 2 container via Unit test? 在单元测试中访问内核是一个更清晰的解决方案。
答案 2 :(得分:2)
单元测试是关于与其他类隔离测试类。要对您的服务进行单元测试,您不需要从配置中读取任何内容。只需在测试中传递一个值即可。最后,它可能与其他值一起使用,对吗?
当然,如果围绕接受的值有一些逻辑/验证,你应该通过测试覆盖它。如果从配置中获取此值,请考虑如何执行此操作。您根本无法使用不同的值测试行为。
如果您想验证您的应用程序是否正常工作(您的类按您期望的方式协作),请使用功能测试或验收测试工具(如Behat)。
答案 3 :(得分:0)
我使用的是Symfony 3.2.2,但我认为这对您也有用。
这只是一条线:
$export_dir = static::$kernel->getContainer()->getParameter('export_dir');