2010-04-26 5 views
3

Je n'arrive pas à effectuer de test fonctionnel sur les téléchargements de fichiers via la méthode post() de sfTestFunctional. Mon action traitant le message HTTP est capable d'obtenir tous les paramètres sauf le champ de téléchargement de fichier. En regardant les codes source de Symfony 1.4, je pense que sfBrowserBase ne gère que le téléchargement de fichiers via la méthode click() (en particulier, le doClickElement()). Est-ce la seule façon de «télécharger» un fichier via un test fonctionnel?test de téléchargement de fichier dans symfony sans appel click()

BTW, je pose cette question car je n'ai pas de formulaire HTML qui représente les données à soumettre, sa partie d'une API REST. Si le test fonctionnel doit 'click()', alors je dois simplement créer une page html fictive avec les éléments de formulaire html nécessaires.

+0

Long shot ... koss, avez-vous eu n'importe où avec le problème ci-dessus? – richsage

+0

@richsage désolé .. trop long. Je ne me souviens plus exactement. vaguement se souvenir d'étendre sfBrowserBase pour contourner ce dont j'ai besoin. pas très d'aide, je suis désolé. – kctang

+0

heh, pas de soucis - merci de me le faire savoir :-) – richsage

Répondre

1

J'ai trouvé ceci: http://www.devcomments.com/Uploads-on-functional-test-for-REST-services-to189066.htm#filtered

Mais je devais modifier un peu pour le faire fonctionner avec Symfony 1.4. En ce qui concerne la forme, j'ai introduit une nouvelle classe 'Browser', qui étend 'sfBrowser' et 'TestFunctional', qui étend 'sfTestFunctional'.

navigateur :: UploadFile():

J'ai ajouté un paramètre de type $ pour le type de contenu, sinon le test échoue ('invalide 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; 
    } 

Vous devez prendre soin de nommer:


$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

Merci pour cela. Presque 5 ans plus tard, c'est toujours une réponse très utile! –

0

Le problème est que le test fonctionnel pense que le mime_type est '' (c'est-à-dire vide). Donc, pour moi un moyen plus facile était de définir les types de fichiers valides dans app.yml:

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

test: 
    .validation: 
    valid_slug_file_types: 
     - 

ensuite le formulaire,

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

L'autre solution (méthodes supplémentaires sur le sfBrowser et sfTestFunctional) gagné Ne travaille pas pour moi si le champ de fichier est requis.

Questions connexes