我想实例化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);
最终对我有效的是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);
}
如果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