CakePHP 3 - 单元测试 tearDown() 无法删除文件:'resource temporarily unavailable'

CakePHP 3 - Unit Test tearDown() failing to remove file: 'resource temporarily unavailable'

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

setUp() 中移动文件并在 teardown() 中删除它们是可行的,只要我不在测试中触及这些文件。当测试返回文件时,tearDown() 无法删除它们,我得到错误:

Warning Error: unlink(C:\xampp\htdocsdeal\keys_test_open.key): Resource temporarily unavailable

我该如何解决这个问题?

整个测试文件如下所示:

    /**
     * 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);
    }

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

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

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

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