2010-01-05 4 views
2

J'ai créé un générateur de données afin de créer des données de test dans mes tests unitaires. Mes générateurs de données créent des valeurs par défaut pour toutes les propriétés, de sorte que les tests qui les utilisent doivent uniquement spécifier les propriétés applicables au test.Un générateur de données de test doit-il être configuré par défaut pour ses primitives non-primitives?

Tenir compte du constructeur suivant:

public class CustomerBuilder 
{ 
    public int id = 0; 
    public Order order = new OrderBuilder().Build(); 

    public CustomerBuilder WithId(int id) 
    { 
     this.id = id; 
     return this; 
    } 

    public CustomerBuilder WithOrder(Order order) 
    { 
     this.order = order; 
     return this; 
    } 

    public Customer Build() 
    { 
     return new Customer(id, order); 
    } 
} 

En faisant cela, si je dois créer un client dans un test dans lequel l'identifiant est important pour moi, mais l'ordre est hors de propos que je peux créer l'objet comme suit :

Customer c = new CustomerBuilder() 
        .WithId(99) 
        .Build(); 

Est-ce une bonne idée? Ou y a-t-il une raison pour laquelle il ne serait pas préférable de supposer que la propriété non primitive doit être construite?

Répondre

6

Ceci est une bonne idée et est connu comme le modèle Test Data Builder :)

de FWIW, j'ai créé un usage général des données de test Builder appelé AutoFixture. Cela vous permettra de simplement écrire

var customer = new Fixture() 
    .Build<Customer>() 
    .With(c => c.Id, 99) 
    .CreateAnonymous(); 

En utilisant AutoFixture vous n'avez pas besoin d'écrire et de maintenir un grand nombre de constructeurs de données de test de séparation personnalisées, mais sinon il est une chose très utile de le faire.

Questions connexes