【问题标题】:Symfony2 getting config params in unit testSymfony2 在单元测试中获取配置参数
【发布时间】:2012-10-23 22:08:30
【问题描述】:

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

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

【问题讨论】:

    标签: unit-testing symfony


    【解决方案1】:

    这对我有用:

    class MyServiceTest extends WebTestCase
    {
        public function testCookies()
        {
            $client = static::createClient();
    
            $myParams = $client->getKernel()->getContainer()->getParameter('my_params');
        }
    }
    

    【讨论】:

    • 虽然我想知道扩展 WebTestCase 进行单元测试是否有任何问题(因为它通常用于功能测试)
    【解决方案2】:

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

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

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

    【讨论】:

    • $container->getParameter() 就是答案
    【解决方案3】:

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

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

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

    【讨论】:

    • 我的服务需要从我们的测试服务器中提取数据(我们的服务器处于生产和测试模式)。我在这里测试的是服务如何对从那里获得的数据做出反应。它不是完全独立的单元测试,但我已经验证了来自服务器的数据是正确的,而不是复制并保存服务器输出并将其手动输入到我的服务中,我想验证服务是否可以获得数据本身。
    • 所以它根本不是单元测试。更多的集成或系统测试。您可以做的最简单的事情是使用 Symfony 的功能测试(仍然是 PHPUnit 测试)。功能测试客户端可以访问容器 (symfony.com/doc/2.0/book/…)。如果您仍想使用常规单元测试类,请在此处查看在单元测试中初始化容器:gist.github.com/1319290
    • 那么如何对下载文件的类进行“单元”测试呢?是否总是将其视为功能测试,因为它超出了自身范围?
    • 如果类的主要目的是文件下载,它不会到达自身之外。它可能会使用原生 PHP 函数来获取文件。如果你的类下载了一个文件但它不是它的主要职责,它将依赖另一个类 (FileDownloader),它可以在测试中被模拟并注入到被测类中。
    【解决方案4】:

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

    这只是一条线:

    $export_dir = static::$kernel->getContainer()->getParameter('export_dir');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2011-10-10
      • 2018-12-14
      • 2022-01-27
      • 1970-01-01
      相关资源
      最近更新 更多