You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Date类GetMonthOffset方法测试失败,求技术方向指引

问题说明

我在做学校作业,卡壳好几天了,不是要找代做,只想要解决思路。给定Date(1, 1, 2014),需要实现函数返回该月份的offset。我不知道怎么把Date构造函数和之前测试用的枚举关联起来,也不确定要不要这么做。前面几个单元测试都过了,但最后一个GetMonthOffsetForSpecifiedDate失败了:针对janDate的断言显示预期是Date.Offset.October,实际得到Date.Offset.May,我搞不懂哪里出问题。

已通过的单元测试代码

// 查找星期几的名称
[TestMethod]
public void GetDayNameFromEnum()
{
    Assert.AreEqual("Sunday", Date.DayOfWeek.Sunday.ToString());
    Assert.AreEqual("Monday", Date.DayOfWeek.Monday.ToString());
    Assert.AreEqual("Tuesday", Date.DayOfWeek.Tuesday.ToString());
    Assert.AreEqual("Wednesday", Date.DayOfWeek.Wednesday.ToString());
    Assert.AreEqual("Thursday", Date.DayOfWeek.Thursday.ToString());
    Assert.AreEqual("Friday", Date.DayOfWeek.Friday.ToString());
    Assert.AreEqual("Saturday", Date.DayOfWeek.Saturday.ToString());
}

// 从枚举获取月份名称
[TestMethod]
public void MonthNameFromEnum()
{
    Assert.AreEqual("January", Date.MonthName.January.ToString());
    Assert.AreEqual("February", Date.MonthName.February.ToString());
    Assert.AreEqual("March", Date.MonthName.March.ToString());
    Assert.AreEqual("April", Date.MonthName.April.ToString());
    Assert.AreEqual("May", Date.MonthName.May.ToString());
    Assert.AreEqual("June", Date.MonthName.June.ToString());
    Assert.AreEqual("July", Date.MonthName.July.ToString());
    Assert.AreEqual("August", Date.MonthName.August.ToString());
    Assert.AreEqual("September", Date.MonthName.September.ToString());
    Assert.AreEqual("October", Date.MonthName.October.ToString());
    Assert.AreEqual("November", Date.MonthName.November.ToString());
    Assert.AreEqual("December", Date.MonthName.December.ToString());
}

// 查找每个月份的起始日偏移值
[TestMethod]
public void TestMonthOffsetEnums()
{
    Assert.AreEqual(0, (int)Date.Offset.January);
    Assert.AreEqual(3, (int)Date.Offset.February);
    Assert.AreEqual(3, (int)Date.Offset.March);
    Assert.AreEqual(6, (int)Date.Offset.April);
    Assert.AreEqual(1, (int)Date.Offset.May);
    Assert.AreEqual(4, (int)Date.Offset.June);
    Assert.AreEqual(6, (int)Date.Offset.July);
    Assert.AreEqual(2, (int)Date.Offset.August);
    Assert.AreEqual(5, (int)Date.Offset.September);
    Assert.AreEqual(0, (int)Date.Offset.October);
    Assert.AreEqual(3, (int)Date.Offset.November);
    Assert.AreEqual(5, (int)Date.Offset.December);
}

// 查找给定日期的月份偏移值
[TestMethod]
public void GetMonthOffsetForSpecifiedDate()
{
    Date janDate = new Date(1, 1, 2014);
    Assert.AreEqual(Date.Offset.January, janDate.GetMonthOffset());

    Date junDate = new Date(6, 16, 2014);
    Assert.AreEqual(Date.Offset.June, junDate.GetMonthOffset());

    Date decDate = new Date(12, 12, 2014);
    Assert.AreEqual(Date.Offset.December, decDate.GetMonthOffset());
}

当前Date类代码

public class Date
{
    public int Day {  get; set; }
    public int Month { get; set; }  
    public int Year { get; set; }

    public Date(int month, int day, int year) 
    {   
        Day = day;
        Month = month;
        Year = year;
    }

    public enum DayOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }

    public enum MonthName { January = 1, February, March, April, May, June, July, August, September, October, November, December }

    public enum Offset { January = 0, February = 3, March = 3, April = 6, May = 1, June = 4, July = 6, August = 2, September = 5, October = 0, November = 3, December = 5 }

    public Offset GetMonthOffset()
    {
        return (Offset) Month;
    }
}

问题根源与解决思路

  1. 核心错误:当前GetMonthOffset()方法直接将Month字段(比如1代表一月)强转为Offset枚举,但Offset枚举的成员值和月份数字完全不对应。例如Month=1强转时,会匹配枚举中值为1的成员,也就是Offset.May,这就是测试失败的直接原因。
  2. 正确逻辑:需要建立月份数字(1-12)到对应Offset枚举成员的映射,而不是直接强转数值。比如:
    • 月份1 → Offset.January
    • 月份2 → Offset.February
    • ...以此类推到月份12 → Offset.December
  3. 实现方案参考:
    • 字典映射:在Date类中定义一个静态字典,提前存储月份与Offset的对应关系:
      private static readonly Dictionary<int, Offset> _monthToOffsetMap = new Dictionary<int, Offset>
      {
          {1, Offset.January},
          {2, Offset.February},
          {3, Offset.March},
          {4, Offset.April},
          {5, Offset.May},
          {6, Offset.June},
          {7, Offset.July},
          {8, Offset.August},
          {9, Offset.September},
          {10, Offset.October},
          {11, Offset.November},
          {12, Offset.December}
      };
      
      然后在GetMonthOffset()中返回_monthToOffsetMap[Month]。
    • Switch-Case:直接在GetMonthOffset()方法中用switch语句匹配月份:
      public Offset GetMonthOffset()
      {
          return Month switch
          {
              1 => Offset.January,
              2 => Offset.February,
              3 => Offset.March,
              4 => Offset.April,
              5 => Offset.May,
              6 => Offset.June,
              7 => Offset.July,
              8 => Offset.August,
              9 => Offset.September,
              10 => Offset.October,
              11 => Offset.November,
              12 => Offset.December,
              _ => throw new ArgumentOutOfRangeException(nameof(Month))
          };
      }
      

内容的提问来源于stack exchange,提问作者Bigcheese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:09:56