我试图在上传方法上进行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 \流\流:: addFile()
错误是什么? 谢谢!
答案 0 :(得分: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请求的第四个参数,但你必须将所有字段作为正文原始数据传递。
答案 1 :(得分:0)
我不知道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
假设您在/var/www/html/myproject/test/build/dummy/
文件夹下有 jpg.jpg ,如下所示。
上传的示例功能:
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."