2010-04-26 105 views
3

我似乎无法通过sfTestFunctional的post()方法执行文件上传功能测试。我处理HTTP帖子的操作能够获取除文件上传字段之外的所有参数。看看Symfony 1.4的源代码,我认为sfBrowserBase只处理通过click()方法(特别是doClickElement())的文件上传。这是通过功能测试“上传”文件的唯一方法吗?文件上传功能测试在symfony没有调用点击()

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

+0

远射...科斯,你是否遇到过上述问题? – richsage 2010-10-20 13:21:26

+0

@richsage对不起..太久了。记不起来了。依稀记得扩展sfBrowserBase来解决我需要的东西。不是很有帮助,我很抱歉。 – kctang 2010-10-20 15:13:13

+0

嘿,不用担心 - 谢谢你让我知道:-) – richsage 2010-10-20 15:14:20

回答

1

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

但我不得不修改它一点点以让它使用Symfony的1.4工作。就形式而言,我引入了一个新的类“浏览器”,它扩展了'sfBrowser'和'TestFunctional',它扩展了'sfTestFunctional'。

浏览器:: uploadFile():

我添加的内容类型$类型参数,否则测试失败( '无效的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' 
))) 

; 
+0

谢谢你。差不多5年后,这仍然是一个非常有用的答案! – 2015-11-25 15:48:05

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额外的方法)获如果文件字段是必需的,我不适合我。