2017-02-03 1 views
0

Ich bin nur lernen Behat so Entschuldigungen, wenn dies ziemlich einfach ist. Ich habe Szenarien wie folgt aus:Wie URL zu ersetzen und Daten in behath

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" 

Das erste Szenario stellt die Verbindung und dann JSON kommt zurück mit einem ganzzahligen Wert. Ich möchte nun , dass Wert in das nächste Szenario ersetzt werden, wo die URL den Platzhalter {ID} hat.

Ich habe versucht, $ this-> Ausgabe auf den Körper (die zurückgegebene Ganzzahl) in der Datei FeatureContext.php für das erste Szenario, und dann eine preg_replace in der Sekunde, um {id} zu der ganzen Zahl zu ändern. Es scheint, dass wenn das zweite Szenario ausgeführt wird, die Ausgabe ausgeblendet wird, bevor das Szenario aufgerufen wird.

sind meine Kontext Methoden für die oben sind:

/** 
    * @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()); 
    } 
    } 

Antwort

-1

Natürlich ist leer, sind die Szenarien und sollten unabhängig sein, was auch immer Sie im ersten Szenario verloren gehen speichern, nachdem das Szenario durchgeführt wird.

Eine Möglichkeit, dies zu tun, ist in eine Datei zu schreiben und aus der Datei zu lesen.

Wie auch immer ich sehe, dass die Validierung aus dem ersten Szenario die Validierungen von der zweiten enthalten, der einzige Unterschied ist, dass in der ersten Sie den Körper der Antwort speichern, nicht eine sehr gute Idee und keine gute Praxis Daten in Validierungsschritten speichern

Versuchen Sie, so viel wie möglich wiederzuverwenden.

Szenarien müssen unabhängig sein. Sie sollten das zweite Szenario ohne das erste Szenario ausführen können.

Hohe Beispiel nur eine Meinung:

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"

Ein weiteres Beispiel:

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"

Dies sind nur einige Beispiele, ich weiß nicht, die Funktionalität, ich bin sicher, dass Sie Rohr tun Sie viel besser, erstellen Sie immer Schritte, die Ihre Projektgeschäftssprache berücksichtigen, um sie später zu verstehen.

Tasklist-Ansatz Sie müssen sicherstellen, dass Sie eine Jobliste haben, wie erforderlich ist und was Sie brauchen, ist zu überprüfen, ob eine Jobliste vorhanden ist (nach Titel zum Beispiel), wenn ja, dann erzeuge nichts anderes die Aufgabe, Liste.

+0

Ok, also lass mich das anders fragen. Ich teste meine API, also sagt das erste Szenario, ein Objekt mit bestimmten Daten zu erstellen. Mein nächstes Szenario möchte daher das neu erstellte Objekt abfragen und bestätigen, dass das, was gespeichert wurde, das ist, was ich gesendet habe. – Gargoyle

+0

Danke, Ihre aktualisierten Beispiele machen Sinn. Schätze die Hilfe. – Gargoyle

+0

OK, immer noch ein wenig zu kämpfen. Nehmen wir an, ich teste meine "Task" API. Aufgaben müssen in einer 'taskList' leben. Um eine Aufgabe zu erstellen, muss ich eine Aufgabenliste erstellt haben. Das bedeutet, dass jedes Szenario, in dem ich etwas mit einer Aufgabe machen möchte, zuerst eine Aufgabenliste erstellen muss, damit ich die Aufgabe erstellen und meine Tests dann gegen die Aufgabe durchführen kann. Das macht keinen Sinn. Ich konnte keine TaskList für die gesamte Feature-Datei erstellen und diese dann verwenden. – Gargoyle