c# - TDD - 为迭代/使用集合的方法编写测试

标签 c# collections tdd

作为 TDD 的新手,我正在努力编写处理集合的单元测试。例如,目前我正在尝试提出一些测试方案来从根本上测试以下方法

int Find(List<T> list, Predicate<T> predicate);

该方法应返回列表 list 中与谓词 predicate 匹配的第一项的索引。到目前为止,我能够想出的唯一测试用例是

  • list 不包含任何项目时 - 返回 -1
  • list 包含 1 个匹配 predicate 的项目时 - 返回 0
  • list 包含 1 个与 predicate 不匹配的项目时 - 返回 -1
  • list 包含 2 个都匹配 predicate 的项目时 - 返回 0
  • list 包含 2 个项目时,第一个匹配 predicate - 返回 0
  • 等...

但是正如您所见,这些测试用例数量众多,并不能令人满意地测试我真正想要的实际行为。我的数学家想做一些归纳法测试驱动开发

  • list 不包含任何项目时 - 返回 -1
  • list 包含 N 项时,对第一项调用 predicate,然后对剩余的 N-1 项递归调用 Find

然而,这引入了不必要的递归。我应该为上述方法在 TDD 中编写什么样的测试用例?


顺便说一句,我正在尝试测试的方法实际上只是Find,只是针对特定的集合和谓词(我可以独立为其编写测试用例)。当然,我应该有一种方法可以避免编写上述任何测试用例,而是简单地测试该方法是否使用正确的参数调用其他一些 Find 实现(例如 FindIndex )?

请注意,无论如何我仍然想知道如何我可以对 Find(或其他类似的方法)进行单元测试,即使结果是以防万一。

最佳答案

如果 find() 有效,那么它应该返回与谓词匹配的第一个元素的索引,对吗?

因此您需要对空列表情况进行测试,对不匹配元素情况进行测试,对匹配元素情况进行一次测试。我会觉得这就足够了。在 TDDing find() 的过程中,我可能会编写一个特殊的第一个元素传递案例,我可以很容易地伪造它。我可能会写:

emptyListReturnsMinusOne()
singlePassingElementReturnsZero()
noPassingElementsReturnsMinusOne()
PassingElementMidlistReturnsItsIndex()

并希望该顺序能够插入我的正确实现。

关于c# - TDD - 为迭代/使用集合的方法编写测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11345592/

相关文章:

C# - 合并集合问题

c# - 限制没有。每秒由 Dns.BeginGetHostEntry 方法生成的请求数或使用任务并行库 (TPL)

c# - 在ASP.NET中运行的异常处理应用程序 block 异常处理程序无法调用Response.End()

java - 用零填充 2D ArrayList

java - Android:将 arraylist<object> 转换为 arraylist<element> 的便捷方法?

c# - 更新文档中的数组时,如何在 MongoDB 和 C# 中使用 $push 更新修饰符

c# - 具有上限的线程安全集合

ruby-on-rails - 如何干燥这个 rspec 测试?

.net - 如何在.Net中编写数据访问层测试?

scala - 使用 TDD 学习 Scala