2015-01-09 5 views
0

Я пытаюсь выполнить тестирование BDD по методу загрузки. Я использую Behat с Mink в проекте symfony2.Как загрузить файл с клиентом Guzzle?

Теперь я в состоянии сделать простой запрос с этим клиентом:

$this->client = $this->mink->getSession('goutte')->getDriver()->getClient(); 

и

$this->client->request("POST", $url, array('content-type' => 'application/json'), array(), array(), $fields); 

без любого вопроса.

Как сделать запрос с файлом? Я попытался это:

$file = new \Symfony\Component\HttpFoundation\File\UploadedFile($path, "video"); 
$fields = json_encode($table->getColumnsHash()[0]); 
$this->client->request("POST", $url, array('content-type' => 'multipart/form-data'), array($file), array(), $fields); 

И ошибка я получаю это:

PHP Fatal error: Call to undefined method GuzzleHttp\Stream\Stream::addFile()

Что такое ошибка? Спасибо!

ответ

1

Ok, наконец, я нашел ответ. Надежда помогает кому-то.

Чтобы загрузить файл, правильный путь:

$fields = $table->getColumnsHash()[0]; //array('name' => 'test', 'surname' => 'test'); 
$fields["file"] = fopen($path, 'rb'); 
$this->client->request("POST", $url, array('Content-Type => multipart/form-data'), array(), array(), $fields); 

Хитрость заключается в том, что вы не должны использовать четвертый параметр запроса Гут, но вы должны пройти все поля в качестве исходных данных для тела.

+0

Какова ваша переменная $ table? – jedema

+0

Это объект Behat \ Gherkin \ Node \ TableNode. У вас есть такой объект, когда вы используете эту [нотацию] (http://docs.behat.org/en/v3.0/guides/2.definitions.html#transforming-tables) – stuzzo

0

Я не знаю о загрузке Gzzle, но простую загрузку, как показано ниже. Вы можете удалить ненужные биты.

Примечание. Я предлагаю вам хранить файлы фиктивных изображений в папке проекта, потому что, если в одном проекте работает много разработчиков, у них будет такая же структура папок, чтобы изображение было доступно. Я видел, как некоторые ребята выбирают изображение со своего рабочего стола, которое отличается от человека к человеку, поэтому тесты терпят неудачу.

files_path ниже должно указывать на каталог вашего проекта, и оно должно существовать, например. /var/www/html/myproject/test/build/dummy/

behat.yml

default: 
    context: 
     class: Site\FrontendBundle\Features\Context\FeatureContext 
     parameters: 
      output_path: %behat.paths.base%/build/behat/output/ 
      screen_shot_path: %behat.paths.base%/build/behat/screenshot/ 
    extensions: 
     Behat\Symfony2Extension\Extension: 
      mink_driver: true 
      kernel: 
       env: test 
       debug: true 
     Behat\MinkExtension\Extension: 
      base_url: 'http://localhost/local/symfony/web/app_test.php/' 
      files_path: %behat.paths.base%/build/dummy/ 
      javascript_session: selenium2 
      browser_name: firefox 
      goutte: ~ 
      selenium2: ~ 
    paths: 
     features: %behat.paths.base%/src 
     bootstrap: %behat.paths.features%/Context 

Если предположить, что у вас есть jpg.jpg под /var/www/html/myproject/test/build/dummy/ папку, как показано ниже.

Пример Функция для загрузки:

Feature: Create League 
    In order to upload a file 
    As a user 
    I should be able to select and upload a file 

    @javascript 
    Scenario: I can create league 
    Given I am on "/" 

    When I attach the file "jpg.jpg" to "league_flag" 
    And I press "Submit" 
    Then I should see "Succeeded." 
+0

HI, спасибо за ваш ответ. Я чего-то не хватает. Я попытался запустить, и он говорит, что он не может подключиться к хосту. Я установил Selenium Driver, должен ли я установить сервер Selenium? Спасибо за помощь! – stuzzo

+0

[См. Мой ответ здесь.] (Http://stackoverflow.com/questions/27542896/configure-behat-with-symfony2/27618212#27618212) Я объяснил, как запустить Selenium. Вы просто загрузите его в свой проект и запустите его с помощью команды. – BentCoder

+0

Благодарим вас за помощь, но, наконец, я нашел способ сделать запрос так, как я хотел. – stuzzo