DateTime.AddDays传递什么值以生成异常

本文关键字:异常 什么 AddDays DateTime | 更新日期: 2023-09-27 18:29:27

我有一个小的实用程序类,可以用输入数据生成哈希代码。什么课&它的算法对这个问题并不重要,但它看起来如下:

public static class HashCodeHelper
{
    /// <summary>
    /// Return a hash code to be added to the link in download data.
    /// </summary>
    /// <param name="baseDateTime">Today's date</param>
    /// <param name="rrid">Profile ID</param>
    /// <param name="downloadCode">Download code to be used for hash code generation.</param>
    /// <returns>Final result is a string in this format "20140715385"</returns>
    public static string GenerateHashCodeForExportLink(DateTime baseDateTime, int rrid, string downloadCode)
    {
        var todayDate = baseDateTime;
        int expireInDays;
        if (!int.TryParse(ConfigurationManager.AppSettings["ExportLinkExpireInDays"], out expireInDays))
            expireInDays = 30; // If not specified in web.config file then use default value
        var expiryDate = todayDate.AddDays(expireInDays);
        var currentDay = todayDate.Day;
        var expiryMonth = expiryDate.Month;
        char nthChar = Convert.ToChar(downloadCode.Substring(expiryMonth - 1, 1));
        var asciiValue = (int)nthChar;
        var mod = (rrid % currentDay);
        var computedHash = (asciiValue * expiryMonth) + currentDay + mod;
        var fullHashCode = todayDate.ToString("yyyyMMdd") + computedHash;
        return fullHashCode;
    }
}

我正在为这个类编写单元测试用例,并意识到AddDays()可以抛出一个ArgumentOutOfRangeException,如下所示:

var expiryDate = todayDate.AddDays(expireInDays);

所以我应该写一个测试,我确实写了下面的测试用例:

    [TestMethod]
    public void GenerateHashCodeForExportLink_IncorrectDate_Throw()
    {
        try
        {
            HashCodeHelper.GenerateHashCodeForExportLink(new DateTime(2015, 1, 31), 501073, "001-345-673042");
            Assert.Fail("Exception is not thrown");
        }
        catch (ArgumentOutOfRangeException)
        {
        }
        catch (Exception)
        {
            Assert.Fail("Incorrect exception thrown");
        }
    }

问题是,我不知道通过什么导致AddDays()方法抛出异常?我试着通过随机日期,例如1-1-1800、2015年1月30日等。

我查看了AddDays()方法的实现,但无法理解。知道吗?

DateTime.AddDays传递什么值以生成异常

如果传入int.MaxValue,则无论原始DateTime是什么,其值都应该在DateTime的可表示范围之外。

示例代码,在csharpad.com上测试:

DateTime.MinValue.AddDays(int.MaxValue);

finally块中使用Assert.Fail是一个错误。。。将始终调用。目前还不清楚你的测试框架是什么,但我希望有这样的东西:

Assert.Throws<ArgumentOutOfRangeException>(() => /* code here */);

使用双精度。MaxValue作为AddDays方法中的参数。

DateTime time = DateTime.Now;
time.AddDays(double.MaxValue);

超出DateTime类的功能时,会触发ArgumentOutOfRangeException。

另一种方法可以是:

DateTime.MaxValue.AddDays(1);

DateTime.MinValue.AddDays(DateTime.MaxValue.Day +1);

这些代码应该抛出ArgumentOutOfRangeException