функциональное тестирование загрузки файлов в Symfony без вызова click () - PullRequest
3 голосов
/ 26 апреля 2010

Кажется, я не могу выполнить функциональное тестирование при загрузке файлов с помощью метода post () sfTestFunctional. Мое действие по обработке сообщения HTTP позволяет получить все параметры, кроме поля загрузки файла.

Глядя на исходные коды Symfony 1.4, я думаю, что sfBrowserBase обрабатывает загрузку файлов только методом click () (в частности, doClickElement ()). Это единственный способ «загрузить» файл через функциональное тестирование?

Кстати, я спрашиваю об этом, поскольку у меня нет HTML-формы, представляющей данные для отправки, являющейся частью REST API. Если функциональный тест должен выполнять «click ()», то мне просто нужно создать фиктивную html-страницу с необходимыми html-элементами формы.

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Я нашел это: http://www.devcomments.com/Uploads-on-functional-test-for-REST-services-to189066.htm#filtered

Но мне пришлось немного его изменить, чтобы заставить его работать с Symfony 1.4. В качестве формы я ввел новый класс Browser, который расширяет sfBrowser и TestFunctional, который расширяет sfTestFunctional.

Browser :: uploadFile ():

Я добавил параметр $ type для типа содержимого, в противном случае тест не пройден ('недопустимый тип mime')


  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 голосов
/ 06 апреля 2011

Проблема в том, что функциональный тест думает, что 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) не будет работать для меня, если поле файла обязательно.

...