CakePHP 4+PHPUnit测试:如何构造Laminas\Diactoros\UploadedFile实例
解决方法
直接在测试代码中实例化Laminas\Diactoros\UploadedFile对象,替换掉$data里原来字符串格式的image_file字段即可,具体操作如下:
引入UploadedFile类
在测试文件顶部添加use语句:use Laminas\Diactoros\UploadedFile;准备测试文件
确认你指定的测试文件真实存在且路径正确,比如示例里的tests/Fixture/csv/student-import-test-1.csv,保证文件可读。创建UploadedFile实例
用文件相关参数构造实例:// 获取测试文件的真实路径 $filePath = realpath('tests/Fixture/csv/student-import-test-1.csv'); // 打开文件流 $fileStream = fopen($filePath, 'r'); // 实例化UploadedFile $uploadedFile = new UploadedFile( $fileStream, filesize($filePath), // 文件大小 UPLOAD_ERR_OK, // 上传成功的错误码标识 'student-import-test-1.csv', // 客户端显示的文件名 'text/csv' // 文件媒体类型 );修改$data数组
把$data中原来的image_file相关子字段全部删除,替换成刚创建的UploadedFile实例:$data=[ 'name' => 'AñadirAnimal', 'image_file' => $uploadedFile, // 替换为UploadedFile实例 'specie' => 'dog', 'chip' => 'no', 'sex' => 'intact_male', 'race' => 'cat', 'age' => 1, 'information' => 'Es un animal.', 'state' => 'sick', 'animal_shelter' => [ 'start_date' => '2022-11-03 10:47:38', 'end_date' => '2023-05-03 10:47:38', 'user_id' => 1, 'animal_id' => 1 ] ];可选操作
手动设置的$_FILES数组可以删除,因为直接传入UploadedFile实例后,框架的Request对象会正确识别这个上传文件,无需额外模拟全局变量。
补充说明
UploadedFile的构造参数顺序为:文件资源/路径、文件大小、上传错误码、客户端文件名、媒体类型- 如果需要验证控制器的图片类型校验逻辑,建议换成真实的png/jpg格式文件,同时把媒体类型改成对应的
image/png或image/jpeg
内容的提问来源于stack exchange,提问作者Iria
相关产品推荐
相关产品推荐

