3

我似乎无法通过 sfTestFunctional 的 post() 方法对文件上传执行功能测试。我处理 HTTP 帖子的操作能够获取除文件上传字段之外的所有参数。

查看 Symfony 1.4 的源代码,我认为 sfBrowserBase 仅通过 click() 方法(特别是 doClickElement())处理文件上传。这是通过功能测试“上传”文件的唯一方法吗?

顺便说一句,我问这个是因为我没有任何代表要提交的数据的 HTML 表单,它是 REST API 的一部分。如果功能测试必须“click()”,那么我只需要使用所需的 html 表单元素创建虚拟 html 页面。

4

2 回答 2

1

我发现了这个: http: //www.devcomments.com/Uploads-on-functional-test-for-REST-services-to189066.htm#filtered

但我不得不稍微修改它以使其与 Symfony 1.4 一起工作。作为形式问题,我引入了一个新类“Browser”,它扩展了“sfBrowser”和“TestFunctional”,它扩展了“sfTestFunctional”。

浏览器::上传文件():

我为 content-type 添加了 $type 参数,否则测试失败('invalid mime-type')


  public function uploadFile($fieldName, $filename, $type = '')
  {
    if (is_readable($filename))
    {
      $fileError = UPLOAD_ERR_OK;
      $fileSize = filesize($filename);
    }
    else
    {
      $fileError = UPLOAD_ERR_NO_FILE;
      $fileSize = 0;
    }

    $this->parseArgumentAsArray($fieldName, array('name' => basename($filename), 'type' => $type, 'tmp_name' => $filename, 'error' => $fileError, 'size' => $fileSize), $this->files);

    return $this;
  }

TestFunctional::uploadFile()


  public function uploadFile($fieldName, $filename, $type = '')
  {
    $this->browser->uploadFile($fieldName, $filename, $type);

    return $this;
  }

您必须注意命名:


$browser = new TestFunctional(new Browser());
$browser->

  uploadFile('article_image[image]', '/path/to/your/image.gif', 'image/gif')->

  post('/articles/1/images.json', array('article_image' => array(
    'title' => 'foobar',
    'description' => 'lorum ipsum'
  )))

;
于 2011-02-15T15:57:50.350 回答
0

问题是功能测试认为mime_type 是''(即空白)。所以对我来说更简单的方法是在 app.yml 中定义有效的文件类型:

all:
  .validation:
    valid_file_types:
      - text/comma-separated-values
      - text/csv
...et cetera...

test:
  .validation:
    valid_slug_file_types:
      -

然后在表格中,

$this->setValidator('file', new sfValidatorFile(array(
        'mime_types' => sfConfig::get('app_valid_file_types')
    )));

如果需要文件字段,其他解决方案(sfBrowser 和 sfTestFunctional 上的额外方法)对我不起作用。

于 2011-04-05T23:49:18.433 回答