使用另一个经过测试的function来为实际测试做准备是一种好的unit testing方法吗?

我正在尝试使用NUnit进行unit testing。 目前,我正在编写一个简单的测试来熟悉语法和unit testing的方法。 但我不确定我是否通过以下测试做得对:

被测试的类包含一个包含水果名称的字符串列表,其中可以通过class_under_test.addNewFruit(...)添加新的水果名称。 因此,为了测试addNewFruit(...)的function,我首先使用该方法将新字符串添加到列表中(例如“Pinapple”),并在下一步中validation列表是否包含此新字符串。

我不确定这是否是测试方法function的好方法,因为我依赖于另一个函数的响应(我已经在之前的unit testing中测试过)。

这是测试此function的方法,还是有更好的解决方案?

 public void addNewFruit_validNewFruitName_ReturnsFalse() { //arrange string newFruit = "Pineapple"; //act class_under_test.addNewFruit(newFruit); bool result = class_under_test.isInFruitList(newFruit); //assert Assert.That(!result); } 

在一个完美的世界中,每个unit testing只能以单一方式进行。 每个unit testing都“孤立地生活”。 你的addNewFruit测试可以通过打破isInFruitsList来打破 – 但幸运的是,这也不是一个完美的世界。

既然您已经测试了isInFruitsList方法,那么您不必担心。 这就像使用第三方API – 它( 通常 )经过测试, 你认为它有效 。 在你的情况下,你假设isInFruitsList工作,因为,你 – 测试它。

围绕“以单一方式破坏”,您可以尝试在内部公开底层水果列表(并使用InternalsVisibleTo属性),或通过dependency injection传递它。 问题是 – 值得努力吗? 你真正获得了什么? 在这种简单的情况下,你通常会获得很少的东西,引入这些结构的开销通常是不值得的。