3

[编辑]: 单击此处在相应网站上查看问题。

当你正在编写一个测试并且你需要通过测试并且你意识到你需要一个额外的功能应该被分离到它自己的功能中时,你会怎么做?这个新功能也需要测试,但是 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编写测试。但是,我是否应该停止我在测试周期中正在做的事情来创建这个新功能?这似乎打破了“红、绿、重构”的原则。

我是否应该在CollidesWithLine函数内部编写检测 lineSegments Intersect 的代码并在它工作后对其进行重构?这在这种情况下会起作用,因为我可以从LineSegment访问数据,但是在这种数据是私有的情况下呢?

4

3 回答 3

2

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

从测试优先的角度来看,您应该专注于使测试通过,它有几个选项:

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

  2. 拔掉它。将测试替身(模拟)传递给可以模拟合约的方法。

  3. 假装。当你遇到你需要的方法时,为其他测试做笔记,然后编写一个基本的实现(例如“return true”)

于 2012-11-10T15:00:37.363 回答
1

我建议你最好的选择是模拟它,这样你就可以留在你的工作流程中,并且一次也可以测试有限数量的代码。

于 2012-11-09T18:02:52.890 回答
0

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

于 2012-11-09T17:20:19.603 回答