[编辑]: 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 访问数据,但是在那种数据是私有的情况下怎么办呢?
答案 0 :(得分:2)
如果你按照Kent Beck在他的书中定义的那样按照TDD写信,当你遇到你需要测试的东西时,在一张纸上记下它(他称之为一个测试列表),然后专注于当前的测试。肯特建议你一次只能进行一次测试。
从测试第一个角度来看,您应该专注于进行测试通过,它有几个选项:
在当前方法中编写Intersects inline的实现。 “绿色”意味着工作,而不是漂亮。一旦工作,重构代码AND测试。
把它拿出来。将测试双(模拟)传递给可以模拟合同的方法。
假的。当您遇到需要的方法时,请记下其他测试,然后编写基本实现(例如“return true”)
答案 1 :(得分:1)
我建议您最好选择嘲笑它,这样您就可以保留工作流程并且还可以一次测试有限数量的代码。
答案 2 :(得分:0)
我喜欢使用[Ignore]
属性来标记需要注意的测试(例如,当它没有完成时)。这样的测试不会运行。忽略测试在测试运行器中突出显示(通常为黄色或橙色)。即使所有其他测试都通过,在没有任何被忽略的测试时也不会看到绿线。这确保了测试不会被遗忘。