0

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

4

1 回答 1

0

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

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

这个 StackOverflow 问题为您提供了一些关于解析和查询 HTML 的方法的想法:如何在 PHP 中解析和处理 HTML/XML?

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

$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);

添加 如果 HTML 字符串非常大,一种替代方法是将md5()其缩减为短字符串。这仍然会在发生故障时向您发出警告,但(大)缺点是当它发生故障时您将不知道在哪里。如果您对此感到担忧,那么最好使用 DOM 方法(或其可怜的表亲,正则表达式)来挑选 HTML 的几个关键部分进行测试。

于 2012-07-19T23:28:54.543 回答