2011-03-02 141 views

回答

4

根据您的ajax响应如何生成,这可能很容易或更困难。如果使用控制器生成响应,则可以在单元测试中简单调用相应的函数,并检查返回的HTML/XML。例如,如果响应由控制器对象像这样的调用函数生成:

$htmlResponse = $controller->buildPage($_REQUEST); 

然后就可以进行单元测试这样的回应:

$expected = "<html>whatever html you expect</html>"; 
$test_request = array(...); // parameters to test 
$actual = $controller->buildPage($test_request); 

$this->assertEquals($expected, $actual); 

如果不与你产生响应这样的函数调用 - 如果你的AJAX请求是与它的一些动态内容的实际页面,好像你可以做这样的事情:

$_POST['parameter1'] = "test value"; // stuff whichever request object you're using 
             // with the values you need 
ob_start(); 
include('ajax_page.php'); 
$actual = ob_get_clean(); 
$expected = "<html>expected html as above</html>"; 

$this->assertEquals($expected, $actual); 

的PHPUnit还提供assertTag用于测试生成的HTML和XML的断言包含您期望的标记 - 它可能有点挑剔,但它比响应和比较字符串更强大。最终,所有你想知道的是,给定一个输入(请求参数),你得到你期望的输出(返回的HTML或XML)。这是一个AJAX调用的事实并没有从根本上改变方程式。如果你想测试AJAX请求是否正确MADE,你会想在JS测试的客户端做到这一点。

+0

这很好用!但是,如果在单个单元测试会话中运行多个测试,即使使用setUp/tearDown,也可能必须将任何'function'和'class'定义提取到一个单独的PHP文件中,然后使用'require_once ()'。同时关注如何使用'globals';如果你正在使用一个将'include()'放入一个函数的单元测试框架。在这种情况下使用'globals'可能会非常棘手,所以请避免使用它们。 – 2012-01-30 23:41:20