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

时间:2009-05-25 17:58:26

标签: c# unit-testing datetime

我在我的MVC应用程序中使用带有过滤器的Repository模式。项目显示一个交易列表,我可以在其中指定日期以获取交易子集,或指定特定日期以获取该日期的交易(包括年,年/月和年/月/日视图)。 / p>

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

你将如何进行单元测试...这是我的模拟事务测试库。

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 个答案:

答案 0 :(得分:1)

您需要.Add(或CreateTransaction)的变体形式,让您“注入”(假)日期,完全用于此类测试目的。

答案 1 :(得分:0)

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