0

我正在尝试对上传方法进行 BDD 测试。我在 symfony2 项目中使用 Behat 和 Mink。

现在我可以用这个客户端做简单的请求:

$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 致命错误:调用未定义的方法 GuzzleHttp\Stream\Stream::addFile()

错误是什么?谢谢!

4

2 回答 2

1

好的,我终于找到了答案。希望对某人有所帮助。

要上传文件,正确的方法是:

$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);

诀窍是您不能使用 Goutte 请求的第四个参数,但您必须将所有字段作为正文原始数据传递。

于 2015-01-16T09:28:19.490 回答
-1

我不知道 Guzzle 上传,但简单的上传工作如下。您可以删除不必要的位。

注意:我建议您将虚拟图像文件保留在项目文件夹中,因为如果有很多开发人员在同一个项目上工作,他们将具有完全相同的文件夹结构,因此可以访问图像。我见过一些人从他们的桌面上选择的图像因人而异,因此测试失败。

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."
于 2015-01-09T14:09:52.387 回答