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; } }
问题根源与解决思路
- 核心错误:当前
GetMonthOffset()方法直接将Month字段(比如1代表一月)强转为Offset枚举,但Offset枚举的成员值和月份数字完全不对应。例如Month=1强转时,会匹配枚举中值为1的成员,也就是Offset.May,这就是测试失败的直接原因。 - 正确逻辑:需要建立月份数字(1-12)到对应
Offset枚举成员的映射,而不是直接强转数值。比如:- 月份1 →
Offset.January - 月份2 →
Offset.February - ...以此类推到月份12 →
Offset.December
- 月份1 →
- 实现方案参考:
- 字典映射:在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)) }; }
- 字典映射:在Date类中定义一个静态字典,提前存储月份与Offset的对应关系:
内容的提问来源于stack exchange,提问作者Bigcheese
相关产品推荐
相关产品推荐

