2012-11-09 42 views
3

[编辑]:Click here在适当的网站的问题。当TDD测试揭示需要测试的新功能时该怎么办?

当你正在编写一个测试时,你会做什么,你到了需要让测试通过的地步,并且你意识到你需要一个额外的功能应该被分离到它自己的功能?该新功能也需要进行测试,但TDD周期表示要使测试失败,并使其通过重构。如果我正在尝试使我的测试通过,那么我不应该开始另一个失败的测试来测试我需要实现的新功能。

例如,我写了一个函数WillCollideWith(线段点类:

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; 
    } 
} 

我在写一个测试CollidesWithLine当我意识到我需要一个LineSegment.Intersects(LineSegment函数。但是,我应该停止在测试循环中执行的操作来创建这个新功能吗?这似乎打破了“红色,绿色,重构”的原则。

我是否应该只是编写检测lineSegments交点内部的CollidesWithLine函数的代码,并在其工作后对其进行重构?在这种情况下,这可以起作用,因为我可以访问LineSegment中的数据,但是如果这种数据是私密的,那么情况如何呢?

+0

OT here;尝试程序员。 – 2012-11-09 17:11:41

回答

0

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

1

我建议你最好的选择是嘲笑它,这样你留在你的工作流程中,你也一次测试有限的代码量。

2

如果您按照Kent Beck在他的书中对它的定义跟随TDD,当您遇到某些您需要测试的内容时,请在一张纸上记下它(他指的是这个作为测试列表),然后关注当前的测试。肯特建议你应该一次完成一项测试。

从你应该集中精力使测试通过,其中有几个选项的测试第一视角:

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

  2. 搁置它。将测试双(模拟)传入可以模拟合同的方法。

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

+0

如果我编写了一个可以伪装它的方法(返回true),那么当我为该方法编写测试时,我可以编写一个测试来检查该方法是否返回true。在这种情况下,测试会马上通过蝙蝠。没有“红色,绿色,重构”,只有“绿色,重构”。 –

+0

是的。但是如果一个测试通过了,而且我没有编写任何代码来支持它,那么这个测试就是错误的假设。为了防止这种情况,我故意破坏代码以确保测试首先失败。更少的是误报。在伪造实现的情况下,假设实现将随着我编写更多测试而发生变化。 – bryanbcook