在编写 PHPUnit 测试一段时间后,我遇到了一种模式,我想为其找到一个优雅的解决方案。我的项目的单元测试使用了很多临时文件。我将有一个输出文件的函数,我需要对输出(临时)文件做出几个断言。之后我想确保清理临时文件,即使某些断言失败。
下面是一个示例测试文件,使用了一些处理临时文件的方法:
class FooTest extends AhshayTestUnit
{
function setUp()
{
$this->tmps[] = array();
}
function tearDown()
{
foreach ($this->tmps as $tmp)
{
@unlink($tmp);
}
}
function tmp()
{
$this->tmps[] = $tmp = tempnam('/tmp', 'test_foo');
unlink($tmp);
return $tmp;
}
function testFoo()
{
$in = 'html2pdf.html';
$out = $this->tmp();
$success = html2Pdf($in, $out);
$this->assertFileExists($out, "should create PDF file");
$this->assertGreaterThan(1024, filesize($out), "output file should be atleast 1k");
# and so on
}
}
这样,即使第一个断言失败,每个测试函数都不需要担心删除 $out
。
既然我已经说了这么多,我想将这些辅助函数融入到我拥有的每个测试对象中。我已经有了自己的扩展 PHPUnit_Framework_TestCase
的类。我可以将我的自定义 setUp()
和 tearDown()
放在我的子类中,但是要求我所有的测试都有自己的设置/拆卸来记住似乎有点蹩脚调用 parent::__construct()
。有没有更优雅的方法来做到这一点? PHPUnit 中是否已经内置了一些东西来处理这个问题?看起来最好的方法是让 PHPUnit 有一些方法来链接设置/拆卸回调。
最佳答案
您可以使用 vfsstream模拟文件系统。这是一个很好的解决方案,通过设计避免了任何垃圾。
自定义解决方案可能是注册一个关闭函数,即使发生 fatal error 也会删除临时文件,就像这个(简单的)示例:
class MyTest extends PHPUnit_Framework_TestCase
{
public function setUp() {
register_shutdown_function(function() {
if(file_exists('temp.file')) {
unlink('temp.file');
}
});
}
... the tests
}
关于PHPUnit 临时文件助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503258/