如何测试只检索模板输出的函数?

时间:2012-07-19 00:32:28

标签: phpunit

我有一个模板类,它抓取HTML并基本上将html返回给调用者。如何使用PHP单元测试调用者?我只是assertTrue(is_string(call_function))吗?这似乎是一个愚蠢的测试,我想我可能会对它进行不正确的测试。

1 个答案:

答案 0 :(得分:0)

返回的HTML应该是格式正确吗?如果是这样,你可以验证它。

和/或如果总是存在某个节点或文本字符串,则可以检查它是否存在。使用strpos,正则表达式或正确的DOM解析器。

此StackOverflow问题为您提供了一些解析和查询HTML的方法:How do you parse and process HTML/XML in PHP?

更一般地说,我通常如何测试返回字符串的函数的方法是使用:

$html=call_function();
$this->assertEquals("dummy",$html);

然后它失败了,但告诉我正确的输出,所以我将其粘贴到:

$html=call_function();
$expected=<<<EOD
<html>
...
</html>
EOD;
$this->assertEquals($expected,$html);

如果再次失败,我会研究我所拥有的两个正确的答案之间的差异。如果这是一个好的单元测试,他们真的会有所不同吗?我是否想使用模拟对象来替换系统的某些无法控制的方面? (例如,如果它返回的HTML是谷歌搜索结果,那么我可能想要一个模拟对象模拟调用谷歌,但总是返回完全相同的搜索结果页面。)

如果唯一的区别是时间戳,我可能会使用正则表达式来搜捕和销毁它们,给我一个应该总是相同的字符串,例如。

$html=preg_replace('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/','[TIMESTAMP]',$html);

ADDITION 如果HTML字符串非常大,则可以使用md5()将其缩减为短字符串。当事情发生时,这仍然会警告你,但(大)缺点是当它破裂时你不知道在哪里。如果您担心这一点,那么最好使用DOM方法(或其表兄弟,正则表达式)来挑选HTML的几个关键部分进行测试。