当TDD测试显示需要测试的新功能时,该怎么办?

时间:2012-11-09 17:10:33

标签: unit-testing tdd

[编辑]: Click here了解相应网站上的问题。

当你编写测试时,你做了什么,你到了需要进行测试的地步,你意识到你需要一个额外的功能,应该分成它自己的功能?这个新函数也需要进行测试,但是TDD循环说要使测试失败,让它通过然后重构。如果我正在试图让我的测试通过的那一步,我不应该开始另一个失败的测试来测试我需要实现的新功能。

例如,我正在编写一个具有函数 WillCollideWith( LineSegment 的点类:

public class Point {
    // Point data and constructor ...

    public bool CollidesWithLine(LineSegment lineSegment) {
        Vector PointEndOfMovement = new Vector(Position.X + Velocity.X,
                                               Position.Y + Velocity.Y);
        LineSegment pointPath = new LineSegment(Position, PointEndOfMovement);
        if (lineSegment.Intersects(pointPath)) return true;
        return false;
    }
}

当我意识到我需要 LineSegment.Intersects( LineSegment 功能时,我正在为 CollidesWithLine 编写测试。但是,我应该停止我在测试周期中所做的事情来创建这个新功能吗?这似乎打破了“红色,绿色,重构”原则。

我应该只编写检测到lineSegments在 CollidesWithLine 函数内部相交的代码,并在它工作后重构它吗?这可以在这种情况下工作,因为我可以从 LineSegment 访问数据,但是在那种数据是私有的情况下怎么办呢?

3 个答案:

答案 0 :(得分:2)

如果你按照Kent Beck在他的书中定义的那样按照TDD写信,当你遇到你需要测试的东西时,在一张纸上记下它(他称之为一个测试列表),然后专注于当前的测试。肯特建议你一次只能进行一次测试。

从测试第一个角度来看,您应该专注于进行测试通过,它有几个选项:

  1. 在当前方法中编写Intersects inline的实现。 “绿色”意味着工作,而不是漂亮。一旦工作,重构代码AND测试。

  2. 把它拿出来。将测试双(模拟)传递给可以模拟合同的方法。

  3. 假的。当您遇到需要的方法时,请记下其他测试,然后编写基本实现(例如“return true”)

答案 1 :(得分:1)

我建议您最好选择嘲笑它,这样您就可以保留工作流程并且还可以一次测试有限数量的代码。

答案 2 :(得分:0)

我喜欢使用[Ignore]属性来标记需要注意的测试(例如,当它没有完成时)。这样的测试不会运行。忽略测试在测试运行器中突出显示(通常为黄色或橙色)。即使所有其他测试都通过,在没有任何被忽略的测试时也不会看到绿线。这确保了测试不会被遗忘。