加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

单元测试 – 如何在tdd中重构测试?

发布时间:2020-12-14 04:48:46 所属栏目:百科 来源:网络整理
导读:我正在执行这个TDD kata练习: http://osherove.com/tdd-kata-1 我制作了以下代码(在这个练习中从1到5分 – 我有单元测试): public class StringCalculator{ private readonly string[] _defaultSeparators = { ",","n" }; public int Add(string numbers)
我正在执行这个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方法执行添加测试.

但是,在不破坏测试的情况下,这样做的正确方法是什么?

解决方法

我会警告不要像你那样移动测试,那么你的测试与实现有关,这意味着它们非常脆弱,因此每次你想要改变你的实现时你都必须改变你的测试.当您拥有大量代码库并且可能成为进行更改的禁止因素时,这很快就会变得昂贵.

您现有的测试应该指定字符串计算器的行为,因此只要您保持所需的行为,您就可以将实现重构为任何内容.

我倾向于认为一个单位是一个“行为单位”,可能需要几个班来实现这个.

如果要将一些类放在不同的程序集中,事情可能会发生变化,此时您可能希望在新程序集旁边进行一些新的测试,以确保这些组件的行为不会意外更改,但在这种情况下我怀疑你会这样做.

如果你开始在几个地方重用这些类,事情也可能会发生变化,此时你可能需要单独的测试来指定类的行为,而不考虑它们在这些地方的使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读