Question

Je viens juste de commencer à pratiquer BDD en utilisant l'approche GWT du code ci-dessous exercent et juste rendu compte que je ne peux pas faire le deuxième test.

Mon GWT va quelque chose comme

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

Ensuite, il doit en informer l'utilisateur et pas enregistrer la réponse si elle est vide

Je codé vers le haut comme si

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
    }
}

Mais alors je me suis aperçu que je ne peux pas le second cas, parce que le premier cas, il faut des données d'avoir quelque chose en elle alors que le second dit que les données doivent être une chaîne vide.

Est-ce que cela veut dire que je partagerai mon GWT en quelque chose comme

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

Si tel est le cas, je serais en train d'écrire une énorme quantité de scénarios nuls pour le retour

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

Est-ce que je devrais écrire mes spécifications BDD? Et suis-je même dans le O_O droit forum?

Était-ce utile?

La solution

Vous voulez inverser les deux clauses de Then, parce qu'ils forment essentiellement différents contextes dans lesquels la classe Query est exercée. Lorsque vous lisez les deux statemenents de Then vous pouvez voir que « si n'est pas vide » et « est vide » forment les deux contextes.

  1. Contexte # 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. Contexte # 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
       };
    }
    

Étant donné que vous pourriez avoir plusieurs possibles valeurs « réponse vide » (null, String.Empty, " ", \r\n), vous pouvez écrire des contextes pour ceux-ci. Souvent, je ne pas écrire les spécifications pour toute combinaison imaginable de valeurs, mais plutôt

  • ont un contexte pour le « chemin heureux », à savoir la réponse est non vide
  • avoir un contexte pour les réponses vides

A la lumière de votre exemple, on pourrait dire que la classe Query n'est pas le bon endroit pour décider si une réponse satisfait la spécification «n'est pas vide ». Vous devriez écrire plutôt jusqu'à cette décision dans une catégorie distincte et Query doit se fonder sur la décision de celui-ci. Cela apporterait des avantages:

  • La séparation des préoccupations: la classe Query et la spécification peut évoluer séparément
  • Vous pouvez réutiliser les spécifications en plusieurs endroits, laissant entendre un problème avec la réponse avant que les messages de l'utilisateur sa réponse vide
  • Vous pouvez obtenir la spécification à l'essai séparément sans se soucier de notification d'utilisateur et base de données permet d'économiser, ce qui empêche l'explosion de contexte pour des raisons de Query
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top