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

Jus*_*tin 14 c# collections tdd

作为TDD的新手,我正在处理处理集合的写单元测试.例如,目前我正在尝试提出一些测试场景来基本上测试以下方法

int Find(List<T> list, Predicate<T> predicate);
Run Code Online (Sandbox Code Playgroud)

方法应该返回列表list中与谓词匹配的第一个项的索引predicate.到目前为止,我能够提出的唯一测试案例就是如此

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

然而,正如您所看到的,这些测试用例数量众多且无法令人满意地测试我实际需要的实际行为.我的数学家想要做一些TDD-by-induction

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

然而,这引入了不必要的递归.对于上述方法,我应该在TDD中编写哪种测试用例?


另外,我试图测试的方法实际上Find只是针对特定的集合和谓词(我可以独立编写测试用例).当然应该有一种方法可以让我避免编写任何上述测试用例,而只是测试该方法是否使用正确的参数调用其他Find实现(例如FindIndex)?

请注意,在任何情况下,我仍然想知道如何进行单元测试Find(或类似的其他方法),即使事实证明在这种情况下我不需要.

Car*_*ter 9

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

因此,您需要对空列表情况进行测试,一个用于无匹配元素的情况,一个用于匹配元素情况.我会发现足够了.在TDDing find()的过程中,我可能会写一个特殊的first-element-pass案例,我可以很容易地伪造.我可能会写:

emptyListReturnsMinusOne()
singlePassingElementReturnsZero()
noPassingElementsReturnsMinusOne()
PassingElementMidlistReturnsItsIndex()
Run Code Online (Sandbox Code Playgroud)

并期望该序列将推动我正确的实现.

  • 您可能想要添加`PassingElementAtEndOfListReturnsItsIndex()`测试. (2认同)