假设一个方法接受一个字符串作为输入参数,并且这个字符串只能包含从 1 到 8 的数字和一个破折号(“/”)。
在开发测试驱动时,您将如何编写单元测试来验证该方法是否进行了正确的参数检查?
我的第一个想法是颠倒 ArgumentException 的要求和测试,即有一个数据驱动的单元测试,它使用所有其他可能的字符调用该方法并期望 ArgumentException。然而,……这感觉有点像用大锤敲碎坚果……
有没有针对这种情况的最佳实践?
假设一个方法接受一个字符串作为输入参数,并且这个字符串只能包含从 1 到 8 的数字和一个破折号(“/”)。
在开发测试驱动时,您将如何编写单元测试来验证该方法是否进行了正确的参数检查?
我的第一个想法是颠倒 ArgumentException 的要求和测试,即有一个数据驱动的单元测试,它使用所有其他可能的字符调用该方法并期望 ArgumentException。然而,……这感觉有点像用大锤敲碎坚果……
有没有针对这种情况的最佳实践?
我的第一个想法是颠倒 ArgumentException 的要求和测试
这是函数应该做的第一件事。如果它是一个公共函数,那么它应该假定它的参数是无效的,除非另有证明。您所说的要求很容易通过正则表达式检查来涵盖 - 如果该正则表达式失败,则抛出 ArgumentException 或 OutOfRangeException。
您将如何编写单元测试来验证该方法是否进行了正确的参数检查
你只需要两个重复调用目标函数的测试方法。对于第一个有一堆带有有效参数的调用,并确保检查返回值(如果有)。
对于第二个测试方法会触发一堆无效输入,包括带有特殊字符、大小写等的字符串,无效输入会触发异常,这将导致测试失败(您需要用预期的异常属性)。
您可以尝试数据驱动单元测试(MSDN:如何:创建数据驱动单元测试)。
这允许您定义数据源,如 XML、CSV 或数据库表,并将多种可能的输入放入其中。单元测试只编写一次,但对源中的每个数据行执行一次。
您可以填充,例如一个包含一些有效输入字符串的 CSV 文件并对其进行测试,以及另一个包含一些无效字符串的 CSV 文件,并使用测试方法检查[ExpectedExcetion(typeof(...))]
(或在这种情况下您的代码应该执行的任何操作。)
这很容易实现(参见上面的链接),如果您愿意,您甚至可以随机生成数千种不同格式的可能输入。