我有一个模板类,它抓取HTML并基本上将html返回给调用者。如何使用PHP单元测试调用者?我只是assertTrue(is_string(call_function))
吗?这似乎是一个愚蠢的测试,我想我可能会对它进行不正确的测试。
答案 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的几个关键部分进行测试。