当前位置: 首页 > 知识库问答 >
问题:

如何在Symfony中实例化自动连线服务?

拓拔野
2023-03-14

我想实例化OrderAbstraction服务,它需要在测试用例的构造函数中使用实体管理器。

class OrderAbstraction
{
    ...

    /**
     * @var EntityManager
     */
    private $em;

public function __construct(EntityManager $em)
    {
        $this->em = $em;
        ...
    }
}

我尝试自动连接OrderAbstractionTest,并将OrderAbstraction和实体管理器作为参数。

class OrderAbstractionTest extends TestCase
{
// tried with constructor and without it
    public function testDays(){
        $order = new OrderAbstraction();
        $order->dateFrom(new \DateTime('2019-08-20 14:00'));
        $order->dateTo(new \DateTime('2019-08-28 14:00'));

        $days = $order->days();
        $this->assertEquals(8, $days);
    }
}

my service.yaml,autowire设置为true

    App\Service\OrderAbstraction\:
        resource: '../src/Service/OrderAbstraction.php'
        arguments: 
            $em: '@Doctrine\ORM\EntityManager'

    App\Test\OrderAbstraction\:
        resource: '../tests/OrderAbstractionTest.php'
        arguments: 
            $em : '@Doctrine\ORM\EntityManager'

我一直收到这样的东西:

PHP致命错误:Uncaught ArgumentCounter错误:函数App\Test\OrderAbstractionTest:的参数太少::u construct(),0传入/var/www/html/autocom/bin/.phpunit/phpunit-6.5/src/Framework/TestSuite.PHP第476行,在/var/www/html/autocom/tests/orderactionTest.PHP:13中正好需要1个参数

知道如何实例化像OrderAbstraction这样的服务到其他服务、测试会很棒。因为大多数我在控制器中做这样的事情:

$order = new OrderAbstraction($this->em);

共有2个答案

邓嘉致
2023-03-14

最终对我有效的是php单元模拟,我的代码现在看起来如下:

    public function testDays(){
        $em = $this->getMockBuilder(EntityManager::class)
        ->disableOriginalConstructor()
        ->getMock();

        $order = new OrderAbstraction($em);
        $order->dateFrom(new \DateTime('2019-08-20 14:00'));
        $order->dateTo(new \DateTime('2019-08-28 14:00'));

        $days = $order->days();
        $this->assertEquals(8, $days);
    }
赫连黎昕
2023-03-14

如果autowire设置为true,则不需要services.yml中的任何内容。在OrderAbstraction.php中将EntityManager替换为EntityManager接口,以便在服务自动连接时自动注入EntityManager实例。

命令bstraction.php

use Doctrine\ORM\EntityManagerInterface;

class OrderAbstraction {

  /**
   * @var EntityManager
   */
  private $em;

  public function __construct(EntityManagerInterface $em)
  {
    $this->em = $em;
    ...
  }
}

编辑

由于这将在基本控制器中按预期工作,因此不能使用单元测试类的构造函数来注入服务。根据Symfony的博客:

在Symfony 4.1中,默认情况下,测试允许获取私有服务。实际上,基于WebTestCase和KernelTestCase的测试现在可以通过静态::$container属性访问特殊容器,该属性允许获取未删除的私有服务:

OrderAbstractionTest.php

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use App\Service\OrderAbstraction;

class OrderAbstractionTest extends WebTestCase {

  /**
   * @var OrderAbstraction
   */
  private $order;

  public function testDays() {
    self::bootKernel();
    $this->order = static::$container->get(OrderAbstraction::class);

    $this->order->dateFrom(new \DateTime('2019-08-20 14:00'));
    $this->order->dateTo(new \DateTime('2019-08-28 14:00'));

    $days = $this->order->days();
  }
}

在Symfony 4.3上测试并正常工作
查看此答案了解更多关于Symfony 3.4和4.0的信息

 类似资料:
  • 我在Symfony 3.4中开发一个迷你应用程序。正在使用Guard进行身份验证过程。我已经创建了一个名为LoginForm签字机的类,它扩展了AbstractFormLogin签字机。 接收错误: 无法自动连接服务“app.security.login\u form\u authenticator”:方法“AppBundle\security\LoginFormAuthenticator:::\

  • 当我运行这个测试时,我会得到以下输出(如果我的服务不需要另一个bean,我会得到预期的输出) 由于这个响应,我在line.andExpect(content().contentType(Mediatype.application_json_utf8));上遇到了问题。当我检查response body时(因为body也是空的) 再现问题的示例项目在这里

  • 2014-12-20 15:35:52错误TestContextManager:334-允许TestExecutionListener[org.springframework.test.context.support.dependencyInjectionTestExecutionListener@5af97850]准备测试实例[com.amsb.bariz.base.test.usertest@

  • 问题内容: 如果Service类使用Validated注释进行注释,则同一类无法自动装配自身。 这是在Spring Context尝试加载时引发的异常: 同样,当您有很多依赖于类的自身时,就会发生这种情况(当某个服务使用使用第一个服务的其他服务时)。我想知道@Validated注解,但是我总是在bean上遇到同样的错误。 有人知道我该怎么解决吗? 问题答案: 在这种情况下,注释与错误的自动装配无关

  • 我正在尝试迁移到symfony 3.3并使用新功能/服务: 所以services.yml我有: 我声明我的小枝扩展为: 和此服务的构造函数: 似乎一切都好,但我得到了这个错误: 也不知道如何修复它。

  • 这可能是非常基本的,但我对Spring Boot(以及Spring的许多方面)是新手,文档没有直接回答这个问题。 使用最新的Spring Boot(1.2.1),我进行了一些集成测试,其中Spring被加载并且依赖关系很好地自动连线(设置这个非常简单)。 main类除了带有和以下批注的main方法之外,没有更多的东西: 示例测试: 对于必要的依赖关系,我只有: 在测试中注入ErrorAttribu