在Symfony 2.6/PhpUnit 4.6环境中,我正在寻找一种方法来单独测试一个单一的请求,在该请求可能在稍后阶段调用的情况下例如渲染模板)一个子请求。面向子请求的场景中的Symfony功能测试
具体地,给出下面的页控制器
namespace AppBundle\Controller;
class Page extends Controller{
public function viewAction(){
return ...
}
}
这会使包含以下行的一个枝条模板,这将调用的子请求到Widget
控制器:
{{ render(controller('AppBundle:Widget:footerLatest')) }}
的Widget
控制器有它自己的逻辑,也许它是从数据库中拉出一些东西:
namespace AppBundle\Controller;
class Widget extends Controller{
public function footerLatestAction(){
$foo = $this->getDoctrine()->getRepository('ModelBundle:Foo')->findBy(...);
return [
'foo' => $foo
];
}
}
在我的Page
控制器功能测试,我会嘲笑主义依赖
namespace AppBundle\Tests\Controller;
class PageControllerTest extends \Tests\TestCase{
public function testDetailsView(){
$someMock = $this->getMockBuilder('ModelBundle\Entity\SomeEntity')
->getMock();
$entityManagerMock = $this->getMockBuilder('Doctrine\ORM\EntityManager')
->setMethods(array('persist', 'flush', 'getRepository', 'clear'))
->disableOriginalConstructor()
->getMock();
$repositoryMock = $this->getMockBuilder('ModelBundle\Repository\SomeEntityRepository')
->setMethods(['findOneBy', 'findBy'])
->disableOriginalConstructor()
->getMock();
$client->getContainer()->set('doctrine.orm.default_entity_manager', $entityManagerMock);
...
}
}
此时的问题是清楚的:在每个控制器的测试,我会让我必须考虑到所有的子请求它可能会调用,而这个东西会雪球到可能看起来很糟糕的地方。
我的想法是,我可以安全地认为每个请求(主或子)应被视为完全不同的东西,并且因此明显地测试,即Page
控制器将具有PageControllerTest
这将不调用子请求(它根本不会与任何子请求有关),即使它通常会。而Widget
控制器将拥有自己的WidgetControllerTest
。
那么,如何在功能测试中“禁用/忽略”子请求呢?还是有更好的方法?