我有一个执行各种功能的函数类(令人震惊,我知道)。 其中一项功能是返回给定年份的公共假期列表。 每个计算都有自己的私有函数,因此公共函数实际上只是将各种假日编译成一个列表。
现在我想对此运行一些测试,显然我无法对私有方法运行测试,因此我在TestInitialize方法中提取列表,然后使用它进行各种测试。
问题是,假设我用类似list.SingleOrDefault(p => p.HolidayName.Equals("New Year's Day"))
的方式抽出新年,那么最好在运行预期的测试之前检查它是否为空(它应该在工作日,它应该是我可以说两个断言本身......)。
所以,我想有两个问题 1.这种情况是规则 1单位测试断言的例外情况吗?或者我是否需要将空断言和周末断言分开? 据我所知,有两个断言要确保它不是在周末;一个检查星期几是否等于星期六,一个检查星期几是否等于星期日。或者我错了吗?
答案 0 :(得分:4)
其中一项功能是返回给定年份的公众假期清单。
这是你的合同,这是你应该测试的。
每个计算都有自己的私有函数,因此公共函数实际上只是将各种假日编译成一个列表。
这是无关紧要的,你不应该关注内部的东西。
现在,已经说过你的主要方法在给定的一年中每个预期假期需要进行1次单元测试。在此类测试中,您将检查假日详细信息:日期,日期,名称 - 使用多个断言。除此之外,您的方法可能需要一些边界检查(因为它适用于年份范围)和输入值验证(例如,确保年份实际上代表年份)。
很少有建议:
答案 1 :(得分:3)
您已经知道您无法测试私有方法,但是您可以测试内部方法是否有意义,使它们在您的情况下是内部的。如果它没有意义,那就让它们变得私密并按照你的意图测试它们。
至于第一个问题,你并不一定要遵守那里的每一条规则。如果您是该项目的一个人,请跟随您的感受。我想不出任何我曾经写过的只有一个断言的测试。大多数测试框架可以指出测试期间到底出了什么问题。它给出了一个完美的感觉,首先检查null,然后检查预期的值。
关于第二个问题,你根本不需要两个断言。在您的应用程序中识别出枚举值的日期是有意义的。
public enum WeekDays
{
Monday = 0
Tuesday = 1
...
}
然后您可以轻松断言如下
Assert.IsTrue(holiday.WeekDay < WeekDays.Saturday);
如果您从int
开始,则甚至不必为工作日指定Monday
值。如果您在顶部有Sunday
,请确保为其指定值6,Monday
为0.请详细了解MSDN上的基础enum
值。
如果你不能或不想把它作为枚举,你仍然可以用一个断言来制作它,虽然它不会那么漂亮。
Assert.IsFalse(holiday.WeekDay.StartsWith("S")); // assuming that the WeekDay is a string