PHPUnit与输出缓冲

5
我正在尝试将PHPunit集成到一个大项目中,一切似乎都很顺利,但是所有依赖于ob_start()的方法似乎都会导致不安全的测试。
从网上看来,不安全的测试是指执行未被测试方法覆盖的代码的测试。然而,我完全没有使用@covers注释,并且这只发生在ob_start()上。
所以有几个问题:
1.是否可能解决这个问题? 2.ob_start在测试时是否存在固有问题? 3.是否有一种绕过它的方式?(如果无法解决)
用例是使用一个框架,其视图是返回的(而不是发送到浏览器),Codeigniter是一个经典的例子,你可以返回视图。返回视图取决于ob_start()。非常感谢!

你是否在使用严格模式(请检查phpunit.xml)? - Edson Medina
我没有使用XML,而是使用内联调用,我没有使用--strict标志。当添加--strict(即使它已被弃用)时,更多的测试现在被标记为有风险。 - Patrick
我实际上是指--strict-coverage(phpunit 4.5)。 - Edson Medina
1个回答

4
解决方案有两个,因为它涉及到我遇到的两个问题。
1. 关于具体的问题,在使用一个框架(codeigniter)中的视图时,我简单地使用了加载器的模拟,因此我实现了一个空函数,不会真正加载和输出html。
2. 关于我在PHPunit行为上遇到的实际问题,似乎PHPunit(4.5)会假定如果使用ob_start和ob_clean,则测试是有风险的。然而,当使用ob_get_clean时,测试按预期工作。我不确定为什么,因为我没有深入研究代码本身,但这对我解决了问题。

// 获取缓冲输出,然后 ob_get_clean .... 谢谢!<br/>$out = output(); $out = ob_get_clean(); - Andrew Smith
谢谢你提供的第二点建议,我正在创建一个更美观的 var_dump 函数 :) - Ricky Boyce
这是一个有风险的测试,因为flush会将输出留在缓冲区中,所以下一个测试将以脏缓冲区开始,ob_get_clean会清除缓冲区,因此不会留下任何干扰其他测试的内容。 - MikeT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接