所以我一直在制作一款我想尝试TDD的游戏,所以我的大部分工作代码都没有任何测试,但我想为每个新功能尝试TDD.
我的问题是我的游戏包含大量相互依赖的系统(有点像我不能在没有关卡的情况下使用相机,对象保留大量引用并初始化事物将其他事物作为参数).因此,为了测试雾系统,我需要初始化水平,物理,相机,碰撞(因为它们在某种程度上相互依赖)并且产生大量重复.这是代码:
test( "shadow test", function() {
var b2world=new b2World(new b2Vec2(0, 0), false);
var contactListener = new collisionHandler.CollisionHandler(MASK_BITS);
b2world.SetContactListener(contactListener);
var map = gamejs.http.load('images/prot8.json');
var level = new Level.Level({
map: map,
size: 0.5,
nMaskBits: MASK_BITS.node,
nCategoryBits: MASK_BITS.player | MASK_BITS.birdy | MASK_BITS.innerBody,
world: b2world,
scale: SCALE});
var cam = new Camera.Camera({
lvlWid: this.level.width*SCALE*this.level.blockSize,
lvlHei: this.level.height*SCALE*this.level.blockSize,
yBand: 2,
maxSpeed: 20,
peerWindow: new b2Vec2(350, 300),
scrWid: scrWid,
scrHei: scrHei});
var shadow = new Shadow.Shadow({
width : 300,
height : 300,
level : level,
eye : new b2Vec2(600, 600),
});
ok( shadow.blit, "Shadow is extended from surface" );
ok( shadow.level, "Shadow has reference to the level" );
ok( shadow.eye, "Shadow has reference to player's eye" );
ok( (function() {
for (var i = 0; i < shadow.onScreenBlocks.length; i++) {
var rect = level.boxes[ shadow.onScreenBlocks[i] ];
//this is half finished
}
return true;
}), "Shadow do picks the blocks that are visible on screen" );
ok( (function() {
for (var i = 0; i < level.boxes.length; i++) if ( shadow.notProcessBlock(i) ) {
var rect = level.boxes[i];
if (rect.left < cam.offsetX //at this point I just realized that camera need to be setup in a more complex way...
}
return true;
}), "Shadow only process those blocks that are visible on screen" );
});
Run Code Online (Sandbox Code Playgroud)
总的来说它只是有一个不好的氛围.我认为,更难以理解并更难维持.
在以非TDD方式编写单元测试时,您必须问自己编写的每段代码:"我该如何测试".这会强制您查看代码并确保在测试时可以替换所有依赖项.
在进行TDD时,这个"如何测试这个"从头开始.当您无法替换所有依赖项时,在项目中间引入TDD会导致问题.
单元测试时,您需要确保可以完全隔离测试单元并用模拟或假货替换所有依赖项.然后,您可以控制单元测试的所有输入,以便确保测试所有代码路径.
要在项目中进行单元测试,您必须重构代码才能真正支持单元测试.
我认为在这种情况下TDD不是主要问题.问题是你是否想要使用单元测试,我认为这个问题的答案应该是肯定的!单元测试有许多优点.现在,您面临的问题是您编写的代码很难测试.确保代码是可测试的是可以在编写代码之后完成的,但是现在您的代码很难实现.这是TDD可以提供帮助的地方.TDD将确保您的代码易于测试,因此您可以获得单元测试的所有好处.
我前段时间写了一篇关于单元测试的博客..也许它可以帮助:单元测试,地狱还是天堂?
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |