代码之家  ›  专栏  ›  技术社区  ›  David

如何最好地处理日期测试?

  •  0
  • David  · 技术社区  · 16 年前

    我在我的MVC应用程序中使用一个带有过滤器的存储库模式。项目显示事务列表,在该列表中,我可以指定日期期间以获取事务的子集,或者指定特定日期以获取该日期的事务(包括年、年/月和年/月/日视图)。

    我还具有分页功能,可以根据我们正在查看的视图类型获取下一个和上一个事务。例如,如果我们选择给定年份/月份的所有交易,那么我将根据此日期期间查找上一个和下一个交易。

    对于这样的事情,您如何进行单元测试…这是我的模拟事务测试库。

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

    下面是一个示例测试scnenario。

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

    这是我的过滤方法

    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;
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Alex Martelli    16 年前

    你需要一个不同的形式 .Add (或) CreateTransaction )这可以让您“注入”一个(假)日期,正是为了这样的测试目的。

        2
  •  0
  •   Community CDub    8 年前

    您可以使用与“中所述相同的技术。” How do I unit test for machine specific behaviour? “,以插入/使用/创建/测试特定日期。