15

我有一个 Symfony2 服务,它是使用依赖注入的 config.yml 中的参数构建的。我现在正在尝试对其进行单元测试,发现单元测试无法访问容器,因此无法访问服务。所以我应该使用模拟数据自己构建一个。如果我现在可以读取 config 参数(先到 config_test.yml 然后是 config.yml 等),这对我来说是有意义的,但似乎这也是不可能的。这似乎使单元测试服务变得繁琐,因为我需要将初始化参数编码到测试而不是配置文件中。

如果在单元测试期间确实无法使用来自 config.yml 的参数构建服务,那么有人知道为什么它是 Bad Thing™ 的逻辑吗?

4

4 回答 4

14

这对我有用:

class MyServiceTest extends WebTestCase
{
    public function testCookies()
    {
        $client = static::createClient();

        $myParams = $client->getKernel()->getContainer()->getParameter('my_params');
    }
}
于 2014-12-03T15:36:50.103 回答
8

我找到了这篇文章,因为我自己在测试中需要配置参数。这是谷歌的第一次成功。

但是,这是一个可行的解决方案。可能有更好的。

<?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? 是在单元测试中访问内核的更清洁的解决方案。

于 2013-05-28T08:14:23.190 回答
4

单元测试是将一个类与其他类隔离开来进行测试。要对您的服务进行单元测试,您不需要从配置中读取任何内容。只需在测试中传递一个值。最后,它可能会与其他值一起使用,对吧?

当然,如果围绕接受的值有一些逻辑/验证,您可能应该通过测试来覆盖它。想想如果你从配置中获取这个值你会怎么做。您根本无法使用不同的值测试行为。

如果您想验证您的应用程序是否正常工作(您的类以您期望的方式协作),请使用功能测试或验收测试工具(如 Behat)。

于 2012-10-23T22:28:34.337 回答
0

我正在使用 Symfony 3.2.2,但我认为这也适用于你。

这只是一行:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir');
于 2017-01-17T18:27:34.550 回答