PHPUnit 临时文件助手

标签 php unit-testing phpunit

在编写 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/

相关文章:

PHP:使用 anchor 标记提交表单数据

node.js - 如何对 Mongoose 模型进行单元测试?

reactjs - 类型错误 : Cannot destructure property 'instrument' of 'options' as it is undefined

PHPUnit:失败时跳过所有测试

javascript - isset 函数不起作用

php - 转义数据的最佳方式 JS->PHP->MySQL,反之亦然

PHP + mySQL - 在计数查询后获取行的共享位置

android - Sugar ORM每次单元测试都需要保存记录?

PHPUnit Selenium,clickAndWait() 函数在 Opera 中不起作用

doctrine-orm - 带SQLite内存DB的Symfony/Doctrine UnitTests