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