代码之家  ›  专栏  ›  技术社区  ›  kctang

在symfony中不调用click()的文件上载功能测试

  •  3
  • kctang  · 技术社区  · 14 年前

    我似乎无法通过sfTestFunctional的post()方法对文件上载执行函数测试。我处理httppost的操作可以获取除文件上载字段之外的所有参数。

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   fishbone    13 年前

    http://www.devcomments.com/Uploads-on-functional-test-for-REST-services-to189066.htm#filtered

    但我不得不对它进行一点修改,以便能与symfony1.4兼容。在形式上,我引入了一个新的类“Browser”,它扩展了“sfBrowser”和“TestFunctional”,扩展了“sfTestFunctional”。

    Browser::uploadFile():

    我为内容类型添加了一个$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'
      )))
    
    ;
    
        2
  •  0
  •   matt    13 年前

    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上的额外方法)将不适用于我。