Ruby RSpec示例-网球足球课

Ruby RSpec示例-网球足球课,ruby,tdd,rspec2,Ruby,Tdd,Rspec2,在《编程Ruby 1.9/2.0》一书中,作者给出了一个网球记分器类的示例,该类将通过在实际代码之前编写一些RSpec测试来开发 作者介绍了4个测试: it "should start with a score of 0-0" it "should be 15-0 if the server wins a point" it "should be 0-15 if the receiver wins a point" it "should be 15-15 after they both win

在《编程Ruby 1.9/2.0》一书中,作者给出了一个网球记分器类的示例,该类将通过在实际代码之前编写一些RSpec测试来开发

作者介绍了4个测试:

it "should start with a score of 0-0"
it "should be 15-0 if the server wins a point"
it "should be 0-15 if the receiver wins a point"
it "should be 15-15 after they both win a point"
然后作者建议读者继续写下面的测试来完成课程:

it "should be 40-0 after the server wins three points"
it "should be W-L after the server wins four points"
it "should be L-W after the receiver wins four points"
it "should be Deuce after each wins three points"
it "should be A-server after each wins three points and the server gets one more"
(实际的TennisScorer类为每个玩家添加分数,并以类似“15-15”的格式返回)

作者是否假设只要15-0、0-15和15-15的测试成功,代码在30-15、15-30、0-30、30-0等分数下都能100%工作?换句话说,没有必要对每个可能的分数进行明确的测试? 作者建议进行40-0测试,这是有意义的,因为40打破了0-15-30的惯例(分数*15),那么40-0测试是否足以证明40-30、15-40等同样有效

另外,也许我把这件事复杂化了,但是在我的测试中有一个“随机游戏”,我把随机分数加上100000次,然后动态比较结果,这难道不是更有意义吗?(但我想我的测试很容易包含一些bug…?)。
例如,如果我为乘法方法编写一个测试,我想这将是一种可行的方法(或者我只是检查1*2=2并假设一切正常?

tdd的要点是让您的规范和代码随着时间的推移以小的增量增长。所以你应该从一些简单的事情开始,就像上面概述的那样。然而,随着您的规范套件和代码的增长,您将感觉到需要重构代码和规范。这是理所当然的。我希望您的一个its中的代码是对一个通用方法的一行调用,该方法接受测试方法的输入和预期结果。至少那是我经常去的地方

正如您所指出的,对于上述规范,代码可能无法与30-15等一起使用。这取决于实现结果如何。在这里添加更多规范并重用下面的测试代码是有意义的

我建议在大多数情况下不要使用随机规格,因为你不能保证结果。如果代码本身具有随机行为,那么它可能是有意义的。我会尝试将随机性分离到一个地方,以便对其他地方进行确定性测试