http://localhost:8888/FitNesse.UserGuide.FixtureCode
来点实际的:一个益智游戏 *_*!!
我们从简单的地方开始,那些复杂的问题像是分析地震数据,我们想想就可以了。因为它们实在是很复杂,不适合我们在这里拿来做示例。
这里设想我们正在制作一个益智游戏。这个游戏是这样的:游戏者轮流去转动一个圆形的木板。当它们在一个正方形区域停止时,游戏者就会被问到一个问题。我们还会有更多其他的需求和测试表,像是对于问题回答错误时,或者回答正确时。
现在我们设想我们面对一个需求,或者可以称它为用户故事(user story好听多了)。
“我们可以增加游戏者到这个游戏中,同时我们可以查看现在有多少人在玩这个游戏。”
听起来很easy。我们先设定一个ClassPath,这个写的是我们项目的路径。没有ClassPath,FitNesse找不到我们的夹具。
Classpath:C:\workspace\TriviaGameFitNesseExample\
测试表什么样子呢?
表略…
表告诉我们,如果我们增加一个叫Al的用户到游戏里,游戏人数应为1,如果再增加一个叫Bertha的,游戏人数就为2了。
ADDREMOVEPLAYERFIXTURE的代码
夹具代码什么样子呢?下面这样如何:
代码略…
我想这个有点复杂程度。代码表明什么?我们有个setPlayerName的设置器了,就如同我们需要的,我们还有了addPlayer()和countPlayers()的方法。简单明了。
但是私有的Game是什么样的呢,这些方法调用是什么样的呢,还有为什么这样呢?
委托到真正的代码
夹具代码里的addPlayer()方法相当简单:它仅仅调用了Game类里的addPlayer()方法,而它才做了实际的工作。
代码略…
Game类把用户放到一个ArrayList里,并返回新Player的对象。playerIsPlaying方法返回一个用户是否在玩,getNumberOfPlayers()方法返回集合里的个数。这还不是一个益智游戏,但它满足了我们增加用户和数个数的需求。
我们夹具代码里的addPlayer()方法调用了playerIsPlaying()方法判定对象是否添加成功:有明显意义的返回值。夹具代码里的countPlayers()也很明了:它仅仅调用了Game类里的getNumerOfPlayers。
但是StaticGame干什么用呢?
STATICGAME干什么用?
我们测试表的每一行都单独的调用AddRemovePlayerFixture类。既然我们是把用户增加到一个相同的游戏中,我们每次都需要确保我们使用的是同一个游戏对象。
更进一步说,我们会有很多测试页面来测试这个益智游戏。每个测试页面都会有很多表去测试各种情况下的游戏实例。我们需要它们使用的是同一个东西。所以我们需要单例的游戏对象来让大家共享。下面就是StaticGame的代码:
代码略…
它仅仅是一个静态的Game实例变量。为了安全起见,它是抽象的,你不能实例化StaticGame。