Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 3-单元测试拆卸()无法删除文件:“资源暂时不可用”_Cakephp_Phpunit_Cakephp 3.0_Unlink - Fatal编程技术网

CakePHP 3-单元测试拆卸()无法删除文件:“资源暂时不可用”

CakePHP 3-单元测试拆卸()无法删除文件:“资源暂时不可用”,cakephp,phpunit,cakephp-3.0,unlink,Cakephp,Phpunit,Cakephp 3.0,Unlink,在我的应用程序中,用户可以上传文件,其他用户可以下载文件。作为控制器集成测试的一部分,我将几个测试文件移动到上载目录中,以便测试下载操作 只要我在测试中不接触文件,在安装程序中移动文件和在拆卸过程中删除文件都是有效的。当测试返回文件时,拆卸无法删除它们,我得到错误: 警告错误:取消链接:\xampp\htdocs\2deal\keys\u test\1\u open.key:资源暂时不可用 我怎样才能解决这个问题 我尝试在tearDown中打开和关闭文件,但没有效果。有趣的是,fopen函数成功

在我的应用程序中,用户可以上传文件,其他用户可以下载文件。作为控制器集成测试的一部分,我将几个测试文件移动到上载目录中,以便测试下载操作

只要我在测试中不接触文件,在安装程序中移动文件和在拆卸过程中删除文件都是有效的。当测试返回文件时,拆卸无法删除它们,我得到错误:

警告错误:取消链接:\xampp\htdocs\2deal\keys\u test\1\u open.key:资源暂时不可用

我怎样才能解决这个问题

我尝试在tearDown中打开和关闭文件,但没有效果。有趣的是,fopen函数成功了,因此文件实际上没有被锁定。 我还发现了这个问题,解决方案是使用文件删除对象。所以我添加了unset$this->\u响应;到了撕裂的顶端,但又无济于事。 我试着加上睡眠10;添加开始拆卸,这也没有什么区别。所以这不是时间问题。 整个测试文件如下所示:

    /**
     * setUp method before each test
     */
    public function setUp()
    {
        Configure::write('Keys.path', 'keys_test');

        // Config writing must happen before parent::setUp()
        parent::setUp();

        $files = [
            '1_open.key',
            '1_close.key',
            '2_open.key',
            '2_close.key'
        ];
        foreach ($files as $file)
        {
            copy(self::SOURCE_DIR . $file, ROOT . DS . Configure::read('Keys.path') . DS . $file);
        }
    }

    /**
     * tearDown method after each test
     */
    public function tearDown()
    {
        parent::tearDown();

        // Clear test upload directory
        $files = glob(ROOT . DS . Configure::read('Keys.path') . DS . '*');

        foreach ($files as $file)
        {

            if (is_file($file))
            {
                \unlink($file); // Delete file
            }
        }
    }

    /**
     * Test getFile method
     * 
     * @return void
     */
    public function testGetFile()
    {
        $this->get('/carkeys/get-file/1/open.json');

        $file = $this->_response->getFile();

        $real_file = self::SOURCE_DIR . '1_open.key';

        $this->assertResponseOk();
        $this->assertFileEquals($file->path, $real_file);
    }

文件未锁定,但有一个打开的句柄

从CakePHP3.4开始,响应使用流作为响应体。它在附加正文内容或文件时创建流,并立即打开流进行写入或读取

长话短说,请在尝试删除文件之前关闭流:

$this->_response->getBody()->close();

我不知道你是怎么做到的@ndm,再一次:现场!问:为什么在标准的parent::tearDown中不会发生这种情况?@Roberto我想没有人真正想到过。。。如果符合IntegrationTestTrait::cleanup,可能会欢迎PR: