自从我最初在2006年秋天开始研究ZendFrameworkMVC以来,我一直在宣传您可以通过使用Request和Response对象来测试ZFMVC项目;事实上,这就是我实际测试FrontController和Dispatcher所做的。然而,直到最近,在您的用户空间项目中从来没有一种简单的方法可以做到这一点;默认的请求和响应对象使得难以轻松快速地设置测试,并且引入前端控制器以使其可测试的方法在很大程度上没有记录。
因此,过去几个月我正在进行的项目之一是使用PHPUnit创建用于ZF项目功能测试的基础结构。在过去的这个周末,我做出了最终的提交,使这个功能特性变得完整。
新功能提供了几个方面:
- 存根测试用例类,用于请求和响应对象的HTTP版本,包含设置请求环境的方法(包括设置GET、POST和COOKIE参数、HTTP请求标头等)。
Zend_Dom_Query
,一个使用CSS选择器(和XPath)查询(X)HTML和XML文档的类。- 使用
Zend_Dom_Query和Response对象进行比较。
- 一个专门的PHPUnit测试用例,包含用于引导MVC应用程序、分派请求以及利用上述约束和对象的各种断言的功能。
李>
您想测试什么?
- HTTP响应代码
- 该操作是否导致重定向,以及重定向到何处
- 是否存在某些DOM工件(特别有助于确保DOM结构对于JS操作是正确的)
- 存在特定的HTTP响应标头和/或其内容
- 最后使用了什么模块、控制器和/或操作调度循环的迭代
- 选择了什么路线
目的是让测试您的控制器变得简单而有趣。让我们看一个例子:
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = array($this, 'appBootstrap'); parent::setUp(); } public function appBootstrap() { $this->frontController->registerPlugin( new Bugapp_Plugin_Initialize('test') ); } public function testCallingControllerWithoutActionShouldPullFromIndexAction() { $this->dispatch('/user'); $this->assertResponseCode(200); $this->assertController('user'); $this->assertAction('index'); } public function testIndexActionShouldContainLoginForm() { $this->dispatch('/user'); $this->assertResponseCode(200); $this->assertSelect('form#login'); } public function testValidLoginShouldInitializeAuthSessionAndRedirectToProfilePage() { $this->request ->setMethod('POST') ->setPost(array( 'username' => 'foobar', 'password' => 'foobar' )); $this->dispatch('/user/login'); $this->assertTrue(Zend_Auth::getInstance()->hasIdentity()); $this->assertRedirectTo('/user/view'); } }
您会注意到setUp()
方法将回调分配给$bootstrap
属性。这允许测试用例调用该回调来引导应用程序;或者,您可以指定要包含的文件的路径,该文件将执行您的引导程序。在上面的示例中,我实际上只是将一个“初始化”插件添加到负责引导我的应用程序的前端控制器(通过routeStartup()
挂钩)。
然后我有几个测试用例。第一个检查以确保在未提供任何操作时调用defaultaction。第二个检查以确保该页面上存在登录表单(通过使用CSS选择器查找ID为“登录”的表单)。第三步检查我在使用良好凭据登录时是否获得了有效身份验证会话,以及我是否被重定向到适当的位置。
当然,这只是冰山一角;我还创建了其他一些断言。
您可以在ZendFramework标准孵化器中预览功能;在其中查找Zend_Test_PHPUnit_ControllerTestCase
,以及文档树中的Zend_Test
文档(以人类可读的形式DocBookXML)。
对于那些决定开始玩这个的人,我很乐意得到任何反馈。然而,这样做的最佳地点是在fw-mvc邮件列表上;说明在ZFwiki上。