单元测试断言查询

时间:2013-11-15 04:58:08

标签: c# unit-testing

我有一个执行各种功能的函数类(令人震惊,我知道)。 其中一项功能是返回给定年份的公共假期列表。 每个计算都有自己的私有函数,因此公共函数实际上只是将各种假日编译成一个列表。

现在我想对此运行一些测试,显然我无法对私有方法运行测试,因此我在TestInitialize方法中提取列表,然后使用它进行各种测试。

问题是,假设我用类似list.SingleOrDefault(p => p.HolidayName.Equals("New Year's Day"))的方式抽出新年,那么最好在运行预期的测试之前检查它是否为空(它应该在工作日,它应该是我可以说两个断言本身......)。

所以,我想有两个问题 1.这种情况是规则 1单位测试断言的例外情况吗?或者我是否需要将空断言和周末断言分开? 据我所知,有两个断言要确保它不是在周末;一个检查星期几是否等于星期六,一个检查星期几是否等于星期日。或者我错了吗?

2 个答案:

答案 0 :(得分:4)

  

其中一项功能是返回给定年份的公众假期清单。

这是你的合同,这是你应该测试的。

  

每个计算都有自己的私有函数,因此公共函数实际上只是将各种假日编译成一个列表。

这是无关紧要的,你不应该关注内部的东西。

现在,已经说过你的主要方法在给定的一年中每个预期假期需要进行1次单元测试。在此类测试中,您将检查假日详细信息:日期,日期,名称 - 使用多个断言。除此之外,您的方法可能需要一些边界检查(因为它适用于年份范围)和输入值验证(例如,确保年份实际上代表年份)。

很少有建议:

  • 在测试时,总是试着想想我的方法调用者会期望什么?然后围绕这些假设编写测试。您的调用者需要假期列表,这应该是您在测试此方法时的主要关注点。
  • 每次测试1断言非常危险的误解。这不是关于单Assert.AreEqual ...次呼叫 - 它是关于验证一个逻辑概念(如提到herehere)。在您的情况下,假期就是这样的概念。您可以通过检查所有必需的属性来验证它(断言其正确性)。知道假期的正确日期是没有价值的,除非你知道假期是什么。

答案 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