如何在Symfony 2中测试无路由的内部控制器
我试图通过将模板和控制器代码重构为可重用组件来减少冗余代码,然后通过其他模板中的如何在Symfony 2中测试无路由的内部控制器,symfony,testing,Symfony,Testing,我试图通过将模板和控制器代码重构为可重用组件来减少冗余代码,然后通过其他模板中的render(controller('AppBundle:Foo/Bar:baz'))构造使用这些组件 当然,我想测试这些组件。然而,在有关功能测试的示例中,需要实际的路由来发出虚假的测试请求。但是我的BarController在这里纯粹是内部的,没有连接到它的路由。如何测试此控制器 创建虚拟路由并不总是可能的,因为某些参数是无法通过URL传递的模型对象。我这样做是错误的吗?如果控制器被设置为服务,那么它们可以很容易
render(controller('AppBundle:Foo/Bar:baz'))
构造使用这些组件
当然,我想测试这些组件。然而,在有关功能测试的示例中,需要实际的路由来发出虚假的测试请求。但是我的BarController
在这里纯粹是内部的,没有连接到它的路由。如何测试此控制器
创建虚拟路由并不总是可能的,因为某些参数是无法通过URL传递的模型对象。我这样做是错误的吗?如果控制器被设置为服务,那么它们可以很容易地进行测试,就像任何其他类都可以进行单元测试一样。甚至在Symfony 3.3开始默认为他们提供服务之前,我已经修改了我自己的一些,以便让他们能够像这样更容易地进行测试。服务方法听起来不错,但我现在只是这样做:
self::$kernel->getContainer()->get('router')->getContext()->setParameter('_locale', 'en');
$controller = new MyController();
$controller->setContainer(self::$kernel->getContainer());
$response = $controller->myAction($arg1, $arg2, $argWhatever);
// assertions here
似乎工作正常。这是一个选项,或者即使它们没有注册为服务,在功能测试中,您应该能够构建它们并将容器(从功能测试客户端的内核)注入它们。如果没有实际请求,您如何正确设置环境?具体地说,我在生成路由URL时遇到了一个细枝错误,因为缺少
\u locale
参数