【问题标题】:Unit test image file upload单元测试图片文件上传
【发布时间】: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


【解决方案1】:

您应该为您的测试代码使用客户端 HTTP。 Guzzle 可以通过 multipart 选项帮助您。它适用于 PHPUnit。

【讨论】:

  • 我会调查的。
猜你喜欢
  • 2013-09-30
  • 1970-01-01
  • 2017-03-31
  • 2013-06-11
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多