【发布时间】:2019-10-21 17:40:30
【问题描述】:
我需要为文件上传编写单元测试。但是,我不知道如何仅使用 php 代码发布图像。
到目前为止的测试功能:
public function testValidateAddAdminFormSuccess() {
//prepare
$testFile = array(
'name' => 'test.jpeg',
'tmp_name' => 'Macintosh HD/Applications/mampstack-7.1.30-0/apache2/htdocs/',
'type' => 'image/jpeg',
'size' => '6717',
'error' => 0
);
$_FILES['image'] = $testFile;
$_POST['productName'] = 'test';
$_POST['price'] = 45;
$_POST['productDesc'] = 'test description';
$_POST['storeName'] = 'test store';
$_POST['amount'] = 204;
$_GET['product'] = 0;
$database = new DatabaseTest();
$adminModel = new AdminModel(NULL, $database);
//run
$adminModel->validateAddAdminForm();
//validate
$this->assertNotNull($adminModel);
$this->assertTrue($adminModel->valid);
}
我在管理模型中的验证上传方法:
private function validateUploadFile() {
$targetDir = 'images/';
$this->imgUrl = $targetDir . basename($_FILES['image']['name']);
$imageFileType = strtolower(pathinfo($this->imgUrl, PATHINFO_EXTENSION));
if (isset($_POST['submit']) && !empty($_FILES['image']['name']) || $this->isEditing() && !empty($_FILES['image']['name'])) {
$check = getimagesize($_FILES["image"]['tmp_name']);
if ($check !== false) {
} else {
$this->imageErr = 'File is not an image.';
}
if (file_exists($this->imgUrl)) {
$this->imageErr = "Sorry, file already exists.";
}
if ($_FILES["image"]["size"] > 2000000) {
$this->imageErr = "Sorry, your file is too large.";
}
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) {
$this->imageErr = "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
}
} else if ($this->isEditing()) {
$this->imageChanged = false;
} else {
$this->imageErr = 'Please upload an image.';
}
if (empty($this->imageErr)) {
move_uploaded_file($_FILES["image"]["tmp_name"], $this->imgUrl);
if ($this->isEditing() && !empty(basename($_FILES['image']['name']))) {
$this->imageChanged = true;
}
}
}
我的上传验证方法无法识别该文件。尽管我已经通过它自己的管理页面对其进行了测试,但该方法非常有效。如何在不使用网页的情况下上传图片?
它在 imageErr 中设置的错误:`请上传图片'。
【问题讨论】:
-
move_uploaded_file有一个检查内置,出于安全原因,查看您要移动的文件是否在当前请求中实际上传到服务器,如果不是这种情况,它将失败.因此,您不能通过简单地自己填充 $_FILES 来“伪造”它。您需要执行一个实际的 HTTP POST 请求。 -
(您可能会在 move_uploaded_file 之前收到“请上传图片”消息,这是由于检查是否设置了
$_POST['submit'],而您在编造的 $_POST 中没有提供数据。但即使你解决了这个问题,我在之前的评论中所说的仍然会阻止它以这种方式工作。) -
@04FS 好的,这很有意义。为了清楚起见,没有办法在代码中进行 http post 请求吗?编辑:你对我如何测试这个有什么建议吗?
-
检查这里的任何建议是否有帮助,stackoverflow.com/questions/33281614/…
-
@04FS 我在搜索谷歌时已经发现了。不幸的是,对我的情况没有用。不过感谢您的帮助。
标签: php file-upload phpunit