在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
。
那麼,如何在功能測試中「禁用/忽略」子請求呢?還是有更好的方法?