2012-04-05 149 views
1

我有许多简单的控制器类,它们使用Doctrine的实体管理器来检索数据并将其传递给视图。单元测试基本控制器

public function indexAction() { 
    $pages = $this->em->getRepository('Model_Page')->findAll(); 
    $this->view->pages = $pages; 
} 

我们到底应该测试什么?

  • 我可以测试在行动路由,以确保配置正确
  • 我可能测试相应的视图变量被设置,但这是繁琐

findAll()方法或许应该存储在可以使用模拟数据进行测试的存储库层中,但是这构成了不同的类型的测试并且使我们回到

的问题
我们应该作为控制器测试的一部分进行测试?

回答

1

控制器为您的应用程序保存核心逻辑。尽管简单的“索引”控制器动作没有任何特定的功能,但验证/主动使用数据并生成视图模型的功能几乎是系统的最大功能。

例如,考虑登录表单。无论何时发布登录数据,控制器都应验证登录名/密码并返回:1)登录状态良好时登录索引页。显示欢迎,{用户}文本。 2)到登录页面,说在数据库中找不到登录名。 3)到登录页面,表示在db中找不到密码。

这三种类型的输出构成了完美的测试用例。您应该通过适当的操作来验证正确的视图模型/视图是否被发送回客户端。

你不应该像神秘的东西看待控制器。它只是另一个代码片段,并且它被测试为任何其他代码 - 任何为用户提供业务价值的复杂逻辑都应该进行测试。

此外,我建议使用像黄瓜这样的框架进行验收测试来生成有意义的测试用例。

+0

谢谢德米特里。验收测试对于确保视图中生成的输出是正确的非常有用。非常喜欢Behat with Mink http://docs.behat.org/cookbook/behat_and_mink.html#writing-your-first-web-feature – dianovich 2012-04-05 21:50:07

+0

不客气:) – 2012-04-06 05:13:57

0

控制器可能是最难测试的,因为它有很多依赖关系。理论上你应该完全孤立地进行测试,但正如你已经看到的那样 - 它没有意义。

也许你应该从功能或验收测试开始。它在整体上测试你的控制器动作。我同意以前的答案,您应该尝试验收测试工具。但是Cucumber适用于Ruby,对于PHP,您可以尝试使用Codeception。它使测试变得简单而有意义。

同样在Codeception页面上有关于how to test sample controllers的文章。