【发布时间】:2015-06-01 07:51:41
【问题描述】:
我正在执行这个 TDD kata 练习:http://osherove.com/tdd-kata-1
我生成了以下代码(本练习中从 1 到 5 的点 - 我对其进行了单元测试):
public class StringCalculator
{
private readonly string[] _defaultSeparators = { ",", "\n" };
public int Add(string numbers)
{
// Parser section (string to list of ints)
var separators = _defaultSeparators;
var isSeparatorDefinitionSpecified = numbers.StartsWith("//");
if (isSeparatorDefinitionSpecified)
{
var endOfSeparatorDefinition = numbers.IndexOf('\n');
var separator = numbers.Substring(2, endOfSeparatorDefinition - 2);
numbers = numbers.Substring(endOfSeparatorDefinition);
separators = new[] { separator };
}
var numbersArray = numbers.Split(separators, StringSplitOptions.RemoveEmptyEntries);
var numbersArrayAsInts = numbersArray.Select(int.Parse).ToArray();
// Validator section
var negativeNumbers = numbersArrayAsInts.Where(c => c < 0).ToArray();
if (negativeNumbers.Any())
{
throw new Exception(string.Format("negatives not allowed ({0})", string.Join(", ", negativeNumbers)));
}
return numbersArrayAsInts.Sum();
}
}
现在我想将代码重构为这样的:
public int Add(string numbers)
{
var numbersAsInts = CalculatorNumbersParser.Parse(numbers);
CalculatorNumbersValidator.Validate(numbersAsInts);
return numbersAsInts.Sum();
}
我应该如何规划重构以正确重构我的代码和单元测试?
我认为我应该将部分测试移至新创建的实现类测试(CalculatorNumbersParserTests 和 CalculatorNumbersValidatorTests),更改一些现有测试并添加用于 Parse 和 Validate 方法执行的测试。
但是在不破坏测试的情况下正确的方法是什么?
【问题讨论】:
-
只需将代码移动到通过 StringCalculator(公共)类型的测试间接测试的内部类中。或者,这两者也可以实现为同一类型的私有方法。
标签: unit-testing tdd