簡體   English   中英

您如何最好地處理帶有日期的測試?

[英]How do you best handle tests with dates?

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

這是測試程序示例。

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

您需要一種.Add (或CreateTransaction )的變體形式,使您可以“注入”(假)日期,正是出於這種測試目的。

您可以使用“ 如何對機器的特定行為進行單元測試? ”中所述的相同技術,以特定日期進行注入/使用/創建/測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM