2015-08-25 6 views
4

Использование Behat для проверки поведения, связанного с загрузкой файла. Использование Goutte и Guzzle для перехвата загрузки файла, чтобы я мог взаимодействовать с ним на другом шаге.Behat: Goutte/Guzzle загрузка файла через cURL «Предупреждение: curl_setopt_array(): 3607 не является допустимым ресурсом File-Handle»

//Where to put the file 
$tmpFile = 'download.zip'; 
$handle = fopen($tmpFile, 'w'); 

$goutteDriver = $this->getSession()->getDriver(); 
$goutteClient = $goutteDriver->getClient(); 

/** @var \Guzzle\Http\Client $guzzleClient */ 
$guzzleClient = $goutteClient->getClient(); 
$guzzleClient->getConfig()->set('curl.options', [CURLOPT_FILE => $handle]); 
$guzzleClient->setSslVerification(false); 

$goutteDriver->visit($url); 

fclose($handle); 

Он отлично работает, но если я запускаю два различных сценария подряд, что запускать этот шаг, я получаю ошибку:

"Warning: curl_setopt_array(): 3607 is not a valid File-Handle resource"

Edit: Я старался не закрывать $ ручку, и то каждый сценарий после него просто пропускается, а не работает. Также попытался использовать $guzzleClient->getConfig()->remove('curl.options');, и это вызвало более поздний шаг, чтобы не работать.

Edit2: Пример проблемы:

Я взял все другие шаги, за исключением того, что я включил код здесь, загрузка файла почтового индекса.

Моя функция в настоящее время в основном выглядит следующим образом:

Background: 
    Given I am logged in as an admin 

Scenario: A 
    When I click "Export All" 

Scenario: B 
    When I click "Export All" 

Когда я запускаю его, результат выглядит следующим образом:

Background:       
    Given I am logged in as an admin 

    Scenario: A 
    When I click "Export All" 

    Scenario: B 

Warning: curl_setopt_array(): supplied argument is not a valid File-Handle resource in C:\wamp\www\cems2\vendor\guzzle\guzzle\src\Guzzle\Http\Curl\CurlHandle.php on line 219 

Call Stack: 
    0.0000  131776 1. {main}() C:\wamp\www\cems2\vendor\behat\behat\bin\behat:0 
    0.0360 1699576 2. Symfony\Component\Console\Application->run() C:\wamp\www\cems2\vendor\behat\behat\bin\behat:32 


When I click "Export All" (skipped) 

Вслед за трассировку стека, что я не могу найти никаких ссылок к любому из моих кодов. Полная трассировка стека находится здесь: http://pastebin.com/Fv48gdYm

+0

Похоже, что fopen не работает во второй раз и $ handle === false. Очевидно, вы можете это проверить. Почему он не работает - используется ли файл? Являются ли сценарии одновременными и пытаются писать в один и тот же файл одновременно? – James

+0

Ошибка на самом деле происходит до шага, это происходит до того, как может произойти первый шаг следующего сценария. Они бегут один за другим. – Jessica

+0

Где происходит ошибка, я предположил на строке 'set curl.options' в приведенном выше коде. – James

ответ

0

Я удалил часть, которая настраивала файл curl opt, а вместо этого просто считывала содержимое ответа в файл.

//Where to put the file 
$tmpFile = 'download.zip'; 
$handle = fopen($tmpFile, 'w'); 

$goutteDriver = $this->getSession()->getDriver(); 
$goutteClient = $goutteDriver->getClient(); 

/** @var \Guzzle\Http\Client $guzzleClient */ 
$guzzleClient = $goutteClient->getClient(); 

//Remove this 
//$guzzleClient->getConfig()->set('curl.options', [CURLOPT_FILE => $handle]); 

$guzzleClient->setSslVerification(false); 

$goutteDriver->visit($url); 

//Add this 
fwrite($handle, $goutteDriver->getContent()); 
fclose($handle); 

И теперь все работает отлично.

+1

Вы должны иметь возможность упростить верхнюю и нижнюю две строки кода: file_put_contents ('download.zip', $ goutteDriver-> getContent()); – elazar

+0

Спасибо @elazar! Готово! – Jessica