Frage

Ich fange gerade an, BDD mit dem GWT -Ansatz für den folgenden Code -Ausübung zu üben und habe gerade festgestellt, dass ich den zweiten Test nicht durchführen kann.

Mein GWT geht ungefähr so

Given there exists an open query
When the user replies to the query
Then it should save the reply if the reply is not blank

Dann sollte es den Benutzer benachrichtigen und die Antwort nicht speichern, wenn er leer ist

Also habe ich es so codiert

public class when_user_replies_to_the_query : OpenQuery
{
    Because
    {
         query.Reply(data);
    }

    ThenIt should_save_the_reply_to_the_database_if_there_is_a_reply

    ThenIt should_notify_the_user_if_there_is_no_text_in_the_reply_and_not_save_to_database
}

public class Query
{
    void Reply(string data)
    {
        //do something
    }
}

Aber dann wurde mir klar, dass ich den zweiten Fall nicht ausführen kann, da der erste Fall Daten benötigt, um etwas darin zu haben, während der zweite Fall besagt, dass Daten eine leere Zeichenfolge sein sollten.

Bedeutet das, dass ich meinen GWT in so etwas wiet?

Given the reply is blank
When the user replies to the query
Then it should notify the user ......

Wenn dies der Fall ist, würde ich eine große Menge von Null -Fall -Szenarien für die Rückkehr schreiben

values being null. Such as
Given the database is null
When retrieving queries
Should reply with error message
When saving queries
Should save to file and reply with error message
When // basically doing anything
Should //give appropriate response

Soll ich meine BDD -Spezifikationen so schreiben? Und bin ich überhaupt im richtigen Forum o_o?

War es hilfreich?

Lösung

Sie möchten die beiden umkehren wollen Then Klauseln, weil sie im Grunde verschiedene Kontexte bilden, unter denen die Query Klasse wird ausgeübt. Wenn Sie beide lesen Then Statementen Sie können sehen, dass "wenn nicht leer ist" und "leer" beide Kontexte bilden.

  1. Kontext Nr. 1:

    Given an open query
    Given a non-blank reply
    When the user replies to the query
    It should save the reply
    
    public class When_the_user_replies_to_the_query_and_the_reply_is_not_blank
    {
       static Query Query;
    
       Establish context = () =>
       {
           Query = new Query();
       };
    
       Because of = () =>
       {
           Query.Reply("answer");
       };
    
       It should_save_the_reply = () =>
       {
           // Use your imagination
       };
    }
    
  2. Kontext Nr. 2:

    Given an open query
    Given a blank reply
    When the user replies to the query
    It should not save the reply
    It should notify the user
    
    public class When_the_user_replies_to_the_query_and_the_reply_is_blank
    {
       static Query Query;
    
       Establish context = () =>
       {
           Query = new Query();
       };
    
       Because of = () =>
       {
           Query.Reply(String.Empty);
       };
    
       It should_not_save_the_reply = () =>
       {
           // Use your imagination
       };
    
       It should_notify_the_user = () =>
       {
           // Use your imagination
       };
    }
    

In Anbetracht der Tatsache, dass Sie mehrere mögliche "leere Antwort" -Werte haben könnten (Wertenull, String.Empty, " ", \r\n), Sie könnten Kontexte für jeden von diesen schreiben. Ich schreibe oft keine Spezifikationen für eine erdenkliche Kombination von Werten, sondern eher

  • Haben Sie einen Kontext für den "glücklichen Pfad", dh Antwort ist nicht leer
  • einen Kontext für leere Antworten haben

In Anbetracht Ihres Beispiels könnte man argumentieren, dass die Query Die Klasse ist nicht der richtige Ort, um zu entscheiden, ob eine Antwort die Spezifikation "nicht leer" erfüllt. Sie sollten diese Entscheidung lieber in einer separaten Klasse codieren und die Query sollte sich auf die Entscheidung dessen verlassen. Dies würde einige Vorteile bringen:

  • Bedenken Trennung: die Query Klasse und die Spezifikation können sich separat entwickeln
  • Sie können die Spezifikation an mehreren Stellen wiederverwenden, wodurch ein Problem mit der Antwort angezeigt wird, bevor der Benutzer seine leere Antwort veröffentlicht
  • Sie können die Spezifikation separat untersuchen lassen, ohne sich über Benutzerbenachrichtigungen und Datenbank -Speichern zu sorgen, um die Kontext -Explosion für zu verhindern Query Bedenken
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top