1

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

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

我们究竟应该在这里测试什么?

  • 我可以在操作上测试路由以确保正确配置
  • 我可能会测试是否正在设置适当的视图变量,但这很麻烦

findAll()方法可能应该位于可以使用模拟数据进行测试的存储库层中,但这构成了一种不同类型的测试,并使我们回到了问题

作为控制器测试的一部分,我们应该测试什么?
4

2 回答 2

1

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

例如,考虑登录表单。每当发布登录数据时,控制器应验证登录名/密码并返回: 1) 只要登录良好,就返回索引页面。显示欢迎,{user} 文本。2)到登录页面,说在db中找不到登录名。3)到登录页面,说在数据库中找不到密码。

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

你不应该把控制器看成神秘的东西。它只是另一个代码片段,它像任何其他代码一样被测试——任何给用户带来商业价值的复杂逻辑都应该被测试。

另外,我建议使用带有 Cucumber 之类的框架的验收测试来生成有意义的测试用例。

于 2012-04-05T20:01:59.233 回答
0

控制器可能是最难测试的东西,因为它有很多依赖项。从理论上讲,您应该完全隔离地对其进行测试,但正如您已经看到的那样 - 它没有任何意义。

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

在 Codeception 页面上还有一篇关于如何测试示例控制器的文章。

于 2012-04-10T21:51:02.210 回答