CakePHP 3-单元测试拆卸()无法删除文件:“资源暂时不可用”
在我的应用程序中,用户可以上传文件,其他用户可以下载文件。作为控制器集成测试的一部分,我将几个测试文件移动到上载目录中,以便测试下载操作 只要我在测试中不接触文件,在安装程序中移动文件和在拆卸过程中删除文件都是有效的。当测试返回文件时,拆卸无法删除它们,我得到错误: 警告错误:取消链接:\xampp\htdocs\2deal\keys\u test\1\u open.key:资源暂时不可用 我怎样才能解决这个问题 我尝试在tearDown中打开和关闭文件,但没有效果。有趣的是,fopen函数成功了,因此文件实际上没有被锁定。 我还发现了这个问题,解决方案是使用文件删除对象。所以我添加了unset$this->\u响应;到了撕裂的顶端,但又无济于事。 我试着加上睡眠10;添加开始拆卸,这也没有什么区别。所以这不是时间问题。 整个测试文件如下所示: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函数成功
/**
* 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: