【问题标题】:How can be any service injected into WebTestCase subclass in Symfony?如何将任何服务注入 Symfony 中的 WebTestCase 子类?
【发布时间】:2018-05-16 20:22:50
【问题描述】:

也许我遗漏了一些东西……嗯,我想是的,但找不到答案。

WebTestCase 生成此构造函数示例:

public function __construct(?string $name = null, array $data = [], string $dataName = '')
{
     parent::__construct($name, $data, $dataName);
}

试图将我的服务添加为第一个或最后一个参数 - Symfony 抛出一个错误:

Type error: Too few arguments to function Tests\AppBundle\Manager\ContactManagerTest::__construct(), 0 passed in /Library/WebServer/Documents/HEPT/vendor/bin/.phpunit/phpunit-5.7/src/Framework/TestSuite.php on line 568 and at least 1 expected in /Library/WebServer/Documents/HEPT/tests/AppBundle/Manager/ContactManagerTest.php:22

我应该以某种方式直接使用容器吗?如果有桥接类,为什么 WebTestCase 类的自动装配不起作用?

【问题讨论】:

    标签: unit-testing symfony phpunit


    【解决方案1】:

    WebTestCase 用于 PHPUnit 的上下文中(与 Symfony 及其依赖注入无关)。

    它们实际上是生成内核及其容器,请参阅从Symfony source code 中提取的这段代码:

    protected static function createClient(array $options = array(), array $server = array())
    {
        $kernel = static::bootKernel($options);
        $client = $kernel->getContainer()->get('test.client');
        $client->setServerParameters($server);
        return $client;
    }
    

    这意味着您可以像这样轻松访问容器:

    $kernel = static::bootKernel($options);
    $container = $kernel->getContainer();
    

    另请注意,static::$kernel->getContainer() 在您创建客户端进行测试后立即可用。

    【讨论】:

    • 谢谢,但我问的问题的答案并不完全。如何在 WebTestCase 中使用所有服务(很多)而不是在配置文件或其他地方指定它们?哪些名称将具有自动加载的服务,以便我可以从容器中调用它们(如果这就是您所提到的)?
    • 底线:你不能。只是不那样工作。特别是如果您谈论的是自动接线服务。完成文档中的示例。
    • 当然可以。也许您的问题是您的服务是私有的?在这种情况下,您需要将其指定为 public 以用于测试目的(为测试进行特殊定义)。这是 Symfony 4.1 中的修复,所有服务仅在测试环境中公开。
    • 据我所知,问题是关于在没有任何配置的情况下将依赖项注入测试用例。这不会发生。当然,您可以按照代码所示从容器中取出东西,但我认为还有其他问题。可能是错的。
    • @Cerad,你是 100% 正确的——这就是我需要的。我正在使用 symfony 3.*,所以我无法在 4.* 上移动整个系统。您能否指导我找到正确的文档,在那里我可以找到任何类型的解决方案来完成我的任务?
    猜你喜欢
    • 2012-08-26
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多