Question

Nous avons besoin d'ajouter un rappel d'événement lorsqu'un utilisateur entre son adresse e-mail sur une page de l'événement. L'événement est un autre objet de domaine. Notre idée initiale était de créer un objet de domaine du client et CustomerService associés:

public class CustomerService {
    public void AddEventReminder(string emailAddress, int eventId) {
       var customer = new Customer(emailAddress);
       customer.AddEmailReminder(eventId);
    }
}

Comment peut-on vérifier dans un test unitaire que la méthode AddEmailReminder a en effet appelé le nouveau client?

Mes pensées:

  1. Utilisez une usine pour créer le client. Cela sent parce que je pensais que vous étiez censé utiliser seulement l'usine où il y avait une certaine complexité dans la création d'objets.
  2. Code Bad. Peut-être qu'il ya une meilleure façon de le faire?
  3. magic Moq.

Sur une note séparée (peut-être est lié), comment pouvons-nous décider quelle est la racine globale ici? Nous avons décidé arbitrairement le client est, mais il pourrait également être l'événement. J'ai lu et comprendre des articles sur les racines globales, mais on ne sait pas dans ce scénario.

Était-ce utile?

La solution

Dans des cas comme cela, je créerais une méthode protégée dans le service qui crée le client, dans le test de remplacer cette méthode avec classe interne anonyme, et faire revenir une maquette objet client. Ensuite, vous pouvez vérifier sur la maquette objet client qui AddEmailReminder a été appelé. Quelque chose comme:

public class CustomerService {
    public void AddEventReminder(string emailAddress, int eventId) {
       var customer = createCustomer(emailAddress);
       customer.AddEmailReminder(eventId);
    }

    protected Customer createCustomer(string emailAddress) {
       return new Customer(emailAddress);
    }
}

et dans le test (en supposant une connaissance limitée C #, mais il doit illustrer le point):

void testCustomerCreation() {
    /* final? */ Customer mockCustomer = new Customer("email");
    CustomerService customerService = new CustomerService() {
       protected Customer createCustomer(string emailAddress) {
           return mockCustomer;
       }            
    };

    customerService.AddEventReminder("email", 14);

    assertEquals(mockCustomer.EventReminder() /* ? */, 14);
}

Autres conseils

Réflexions sur l'API CustomerService

Y a-t-il des raisons particulières pour lesquelles vous avez décidé de résumer cette opération dans un CustomerService? Cela ressemble un peu anémiques pour moi. Se pourrait-il éventuellement être encapsulé directement sur la place client?

Peut-être que vous avez oublié quelque chose de l'exemple de code CustomerService pour simplifier les choses ...

Toutefois, si vous devez, changer la signature de prendre une instance de client résout le problème:

public void AddEventReminder(Customer customer, int eventId)

mais là encore, un Int32 peut difficilement être qualifié objet de domaine, de sorte que la signature devrait vraiment être

public void AddEventReminder(Customer customer, Event event)

La question est de savoir si cette méthode ajoute une valeur quelconque?

Quelle est la racine globale?

Aucun d'entre eux, je pense. Une racine globale indique que vous gérez les enfants uniquement à la racine, et ne serait pas logique de toute façon dans ce cas.

Considérez les options:

Si vous faites la racine de l'événement, cela signifierait que vous pourriez avoir pas CustomerRepository, et la seule façon vous pouvez récupérer, modifier et persister un client serait par un événement. Cela semble très mal pour moi.

Si vous faites client la racine, vous pouvez avoir pas EventRepository, et la seule façon vous pourriez récupérer, modifier et persister un événement serait par un client spécifique. Cela semble tout aussi faux pour moi.

La possibilité que reste est qu'ils sont des racines séparées. Cela signifie aussi qu'ils ne sont pas fixés les uns aux autres, et que vous aurez besoin d'une sorte de service de domaine pour rechercher des événements pour un client ou des clients pour un événement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top