2009-05-25 5 views
0

J'utilise un modèle Repository avec des filtres dans mon application MVC. Le projet affiche une liste de transactions dans lesquelles je peux spécifier une période de date pour obtenir un sous-ensemble de transactions ou spécifier une date spécifique pour obtenir des transactions pour cette date (y compris les vues année, année/mois et année/mois/jour).Comment gérez-vous le mieux les tests avec des dates?

J'ai également des fonctionnalités de pagination pour obtenir les transactions suivantes et précédentes en fonction du type de vue que nous regardons. Par exemple, si nous sélectionnons toutes les transactions pour une année/un mois donné, je trouve les transactions précédentes et suivantes sur la base de cette période.

Comment voulez-vous procéder à des tests unitaires pour une telle chose ... voici mon référentiel de test de transaction fictif.

 
public class TestTransactionsRepository : ITransactionsRepository 
{ 
    private IList<Transaction> db; 

    public TestTransactionsRepository() 
    { 
     db = new List<Transaction>(); 

     int i = 0; 

     for (; i < 10; i++) 
     { 
      db.Add(CreateTransaction(i, 3)); 
     } 

     for (; i < 25; i++) 
     { 
      db.Add(CreateTransaction(i, i)); 
     } 

     for (; i < 80; i++) 
     { 
      db.Add(CreateTransaction(i, 5)); 
     } 
    } 

    private Transaction CreateTransaction(int id, int accountID) 
    { 
     return new Transaction 
     { 
      ID = id, 
      AccountID = accountID, 
      Date = ?? 
     }; 
    } 
} 

Voici un exemple de scénario de test.

 
[TestMethod] 
public void TransactionsRepository_Get_With_Filter_Between_ThisDate_ 
And_ThatDate_Returns_xx_Transactions() 
{ 
    IList<Transaction> transactions = TransactionsRepository.Get() 
             .Between(thisDate, thatDate) 
             .ToList(); 

    Assert.AreEqual(xx, transactions.Count); 
} 

Et ceci est ma méthode de filtre

 
public static IQueryable<Transaction> Between(
this IQueryable<Transaction> qry, DateTime startDate, DateTime endDate) 
{ 
    return from t in qry 
      where t.Date >= startDate && t.Date <= endDate 
      select t; 
} 

Répondre

1

Vous avez besoin d'une forme variante de .Add (ou de CreateTransaction) qui vous permet de « injectez » une date (faux), exactement à ces fins de test .

Questions connexes