2017-02-03 12 views
0

Я просто изучаю, что так извиняюсь, если это довольно просто. У меня есть сценарий, как это:Как заменить URL и передавать данные в behat

Scenario: Create Task 
    Given I have the JSON payload: 
    """ 
    { 
      "task_list_id" : 3, 
      "title" : "From Behat", 
      "display_order" : 1 
    } 
    """ 
    When I send a POST request to task 
    Then one SQL ident is created 

Scenario: Get the Task 
    When I send a GET request to "tasklist/{id}/tasks" 
    Then The response code should be 200 
    And The response content type should be "application/json" 

Таким образом, первый сценарий делает соединение, а затем JSON возвращается с целочисленным значением. Теперь я хочу, чтобы значение было заменено на следующий сценарий, где URL-адрес имеет местозаполнитель {id}.

Я попытался установить $ this-> output в тело (возвращаемое целое число) в файле FeatureContext.php для первого сценария, а затем сделал preg_replace во втором, чтобы изменить {id} на целое число. Похоже, что при запуске второго сценария вывод завершается до вызова этого сценария.

Это мои методы контекст выше:

/** 
    * @Then One SQL ident is created 
    */ 
    public function theResponseBodyShouldBeAnInteger() { 
    $this->theResponseContentTypeShouldBe('application/json'); 
    $this->theResponseCodeShouldBe(201); 

     $body = $this->response->getBody()->getContents(); 
    if (!ctype_digit($body)) { 
      throw New Exception(sprintf('Expected integer response but got "%s".', $body)); 
    } 

    $this->output = $body; 
    echo "Output is '$this->output'\n"; 
    } 

    /** 
    * @When I send a :method request to :uri 
    * 
    * @param $method 
    * @param $uri 
    */ 
    public function iSendARequestTo($method, $uri) 
    { 
    echo "Output is '$this->output'\n"; 
    $uri = str_replace('{id}', $this->output, $uri); 

    try { 
      if ($method == 'POST' || $method == 'PATCH') { 
        $this->response = $this->client->request($method, $uri, ['json' => $this->requestPayload]); 
      } else { 
        $this->response = $this->client->request($method, $uri); 
      } 
    } catch (GuzzleHttp\Exception\ClientException $ex) { 
      throw new Exception($uri . "\n" . $ex->getResponse()->getBody()->getContents()); 
    } 
    } 

ответ

-1

Конечно пусто, сценарии и должны быть независимыми, что вы сохраните в первом сценарии будут потеряны после того, как сценарий будет сделано.

Один из способов сделать это - записать в файл и прочитать из файла.

В любом случае, я вижу, что валидация из первого сценария включает в себя проверку со второго, единственное отличие состоит в том, что в первом вы сохраняете тело ответа, а не очень хорошую идею, а не хорошую практику для сохранять данные в шагах валидации.

Постарайтесь использовать как можно больше.

Сценарии должны быть независимыми. Вы можете запустить второй сценарий без первого.

пример высокого уровня, просто мнение:

Scenario: Api - check response of the created task 
    Given I have the JSON payload 
    When I create a task using POST request -> create request, make sure is successful and save response 
    And I send a GET request to created task -> use saved response to do what you need 
    Then the response code should be 200 
    And the response code should be "application/json"

Другой пример:

Scenario: Api - check response of the created task 
    Given I have have a task based on JSON: -> create request, make sure is successful and save response 
    When I send a GET request to created task -> use saved response to do what you need 
    Then the response code should be 200 
    And the response code should be "application/json"

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

TaskList подход Вы должны убедиться, что у вас есть TaskList, как это требуется, и то, что вам нужно, чтобы проверить, если TaskList доступен (по названию, например), если да, то не делать ничего другого создать задачу список.

+0

Хорошо, позвольте мне спросить об этом по-другому. Я тестирую свой API, поэтому в первом сценарии создается объект с конкретными данными. Поэтому мой следующий сценарий хочет запросить вновь созданный объект и подтвердить, что то, что было сохранено, - это то, что я отправил. – Gargoyle

+0

Спасибо, ваши обновленные примеры имеют смысл. Цените помощь. – Gargoyle

+0

Хорошо, все еще немного борется. Скажем, я тестирую API 'task'. Задачи должны находиться внутри 'taskList'. Поэтому, чтобы создать задачу, я должен был создать список задач. Это означает, что каждый сценарий, в котором я хочу что-то сделать с задачей, должен сначала создать список задач, чтобы я мог создать задачу, а затем выполнить мои тесты против этой задачи? Это не имеет смысла, я не мог создать TaskList для всего файла функций, а затем использовать его. – Gargoyle