我正在使用嵌入式控制器在側面模板中生成動態內容(例如:菜單)如何用phpunit測試symfony2嵌入式控制器?
通常,我執行函數測試來斷言控制器。 到目前爲止,functionnal測試通過,phpunit認爲我的嵌入式控制器代碼覆蓋
我想知道如何測試嵌入式控制器不同的輸入和評估輸出......是單元測試的權利?
我知道單元測試控制器是一個不好的做法,但是如何在沒有請求對象時測試嵌入式控制器? 路由/ url是Twig render()函數處理的內容。
{{ render(controller('AppSuperBundle:Default:generateMenu', {'params': ... })) }}
一個例子來說明:
class DefaultController extends Controller
{
public function testAction()
{
return $this->render('AppSuperBundle::index.html.twig');
}
public function generateMenuAction($route, Array $RouteParams)
{
$repo = $this->getDoctrine()->getRepository(...
//some process to generate params of menu items (eg:locale, url, name...)
return $this->render('AppSuperBundle::menu.html.twig', array('menuItems' => $menuItemsWithParams));
}
}
模板index.html.twig
<html>
<body>
{% block menu %}
{{ render(controller('AppSuperBundle:Default:generateMenu', {'route': app.request.attributes.get('_route'), 'RouteParams': app.request.attributes.get('_route_params')})) }}
{% endblock %}
{% block content %}
...
{% endblock %}
</body>
</html>
你對這個想法?
我想,一般你不應該試圖以這種方式嵌入控制器的輸出。你有沒有檢出https://github.com/KnpLabs/KnpMenuBundle? – nateevans 2015-04-02 21:19:42
感謝您的評論。我使用原則,可翻譯,sluggable和樹來生成我的i18n超鏈接。據我所知,KnpMenuBundle只使用翻譯文件。我的代碼很明確,只使用一個控制器函數和一個模板,所以我沒有看到需要實現一個服務並對其進行自定義。嵌入式控制器應該如何實現? – x0s 2015-04-03 08:10:54
在我與Symfony核心成員和主要文檔編寫人員Ryan Weaver的培訓中,他通常不鼓勵我以非標準方式使用控制器作爲約定。但是我試圖做一些事情,比如從另一個Controller中調用Controller。壞juju。回到你原來的問題,我認爲你可以測試你的嵌入式控制器所在的路線。請參閱http://symfony.com/doc/current/book/testing.html#your-first-functional-test。您可以傳遞不同的參數,並根據您的請求使用搜尋器查找預期的輸出 – nateevans 2015-04-06 19:26:02