1

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

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

问题是,假设我用类似的东西拉出元旦list.SingleOrDefault(p => p.HolidayName.Equals("New Year's Day")),那么最好在运行预期的测试之前检查它是否为空(它应该在工作日,据我所知,这本身就是两个断言...)。

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

4

2 回答 2

4

一个这样的功能是返回给定年份的公共假期列表。

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

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

这是无关紧要的,你不应该担心东西从内部看起来如何。

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

几点建议:

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

您已经知道您不能测试私有方法,但是如果在您的情况下将它们设置为内部方法有意义的话,您可以测试内部方法。如果它没有意义,让它们成为私有的,并在你尝试的时候测试它们。

至于第一个问题,您实际上不必遵守所有规则。如果您是该项目的单身人士,请跟随您的感受。我想不出我写过的任何测试都只包含一个断言。大多数测试框架都可以指出测试过程中到底出了什么问题。首先检查 null 然后检查期望值是一种完美的感觉。

至于第二个问题,您根本不需要两个断言。在您的应用程序中识别日期(如枚举值)是有意义的。

public enum WeekDays
{
    Monday = 0
    Tuesday = 1
    ...
}

然后您可以轻松断言如下

Assert.IsTrue(holiday.WeekDay < WeekDays.Saturday);

如果您从那里开始,您甚至不必指定int工作日的值Monday。如果您Sunday在顶部,请确保您给它一个值 6 并且将为 0。在MSDNMonday上阅读有关基础enum值的更多信息。

如果你不能或不想将它作为枚举,你仍然可以用一个断言来实现它,尽管它不会那么漂亮。

Assert.IsFalse(holiday.WeekDay.StartsWith("S")); // assuming that the WeekDay is a string
于 2013-11-15T08:03:13.673 回答