【问题标题】:file upload functional testing in symfony without calling click()symfony 中的文件上传功能测试,无需调用 click()
【发布时间】:2010-04-26 17:55:44
【问题描述】:

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

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

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

【问题讨论】:

  • 远射... koss,您遇到上述问题了吗?
  • @richsage 对不起..太久了。记不清了。隐约记得扩展 sfBrowserBase 来解决我的需要。不是很有帮助,对不起。
  • 嘿,别担心 - 谢谢你让我知道 :-)

标签: php symfony1 functional-testing


【解决方案1】:

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

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

浏览器::uploadFile():

我为 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'
  )))

;

【讨论】:

  • 谢谢你。差不多 5 年后,它仍然是一个非常有用的答案!
【解决方案2】:

问题在于功能测试认为 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 上的额外方法)对我不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2022-01-06
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多