Как эффективно протестировать доступ к большому файлу с помощью Behat/Mink?

Я хотел бы написать сценарии Behat/Mink, чтобы проверить, могут ли определенные учетные записи пользователей загружать большие файлы. Я могу использовать событие When I follow "largefile.zip", но при этом загружается весь файл.

Вместо того, чтобы тратить время и ресурсы на потоковую передачу большого файла, я хотел бы (например) просто проверить результат запроса HTTP HEAD или просто попытаться начать загрузку файла с запросом HTTP GET, а затем немедленно отменить его и проверить the response status code.

Как я могу сделать это с Behat/Mink?


person smokris    schedule 12.11.2013    source источник
comment
Вы нашли решение? У меня такая же проблема.   -  person Baptiste Donaux    schedule 12.03.2014
comment
@BaptisteDonaux: Нет, еще нет.   -  person smokris    schedule 12.03.2014
comment
На данный момент я пытаюсь просто протестировать загрузку небольшого файла. Я подумал, что могу просто сделать «Когда я следую за файлом somefile.txt», «Тогда ответ должен содержать какой-то текст», но, предположительно, поскольку файл загружается, а не открывается, я просто получаю «Строка какой-то текст не была найдена нигде в HTML-ответе текущая страница.' Вы знаете, как бороться с этим аспектом?   -  person Nathan Stretch    schedule 13.03.2014
comment
@NathanStretch: я тоже еще не понял этого. Я только что проверял код ответа HTTP.   -  person smokris    schedule 13.03.2014
comment
После некоторого чтения и просмотра кода кажется, что нет готового способа сделать это. Вы можете расширить класс BehatContext и добавить пользовательскую функцию, которая использует cURL для захвата раздела вашего файла.   -  person Nathan Stretch    schedule 14.03.2014
comment
Если вы не знакомы с добавлением пользовательских контекстов, это должно помочь: littlehart.net/atthekeyboard/2012/02/26/   -  person Nathan Stretch    schedule 14.03.2014


Ответы (1)


Я согласен с @NathanStretch относительно расширения, так что вот что я сделал.

Этот пример основан на использовании http://download.thinkbroadband.com/5MB.zip в качестве URL-адрес загрузки. Не идеально, так как я не вижу имени файла в заголовках ответов, но у него есть длина содержимого.

<?php

class DownloadContext extends Behat\MinkExtension\Context\RawMinkContext {
  private $headers = [];

  /**
   * @When /^I try to download "([^"]*)"$/
   */
  public function iTryToDownload($url)
  {
    $this->headers = get_headers($url);
  }

  /**
   * @Then /^I should see in the header "([^"]*)"$/
   */
  public function iShouldSeeInTheHeader($header)
  {
    assert(in_array($header, $this->headers), "Did not see \"$header\" in the headers.");
  }
}

С файлом .feature, который имел следующее:

  Scenario: Try to download a file
    When I try to download "http://download.thinkbroadband.com/5MB.zip"
    Then I should see in the header "Content-Length: 5242880"

Если у вас есть контроль над самими загрузками, вы можете указать имя файла в заголовках и проверить его вместо размера. Конечно, лучше, если размер может быть переменным, поскольку я думаю, что это означало бы разделение строки длины содержимого, преобразование в int и затем сравнение. Фу. Вероятно, для этого есть более элегантное решение.

Надеюсь, это немного поможет.

person j boschiero    schedule 22.08.2014