如何在复杂系统中使用TDD
how to use TDD in complex system?
所以我一直在制作一个游戏,直到我想尝试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" );
});
总的来说,它只是有一种不好的氛围。我认为,这更难缠绕我的思想,也更难维持。
当以非TDD方式编写单元测试时,你必须问自己写的每一段代码:"我该如何测试这个"。这会强制您查看代码并确保在测试时可以替换所有依赖项。
在做TDD时,这个"我如何测试这个"从一开始就被烘焙了。在项目中间引入 TDD 会导致无法替换所有依赖项的问题。
在单元测试时,您需要确保可以在完全隔离的情况下测试单元,并将所有依赖项替换为模拟或假货。然后,您可以控制单元测试的所有输入,以便确保测试所有代码路径。
为了使单元测试在您的项目中工作,您必须重构代码以真正支持单元测试。
我认为在这种情况下,TDD不是主要问题。问题是你是否想使用单元测试,我认为这个问题的答案应该是肯定的!单元测试有很多优点。现在,您面临的问题是您编写的代码难以测试。确保你的代码是可测试的,这是可以在你编写代码之后完成的,但正如你现在所经历的那样,这是非常困难的。这就是TDD可以提供帮助的地方。TDD将确保您的代码易于测试,因此您可以获得单元测试的所有好处。
前段时间我写了一篇关于单元测试的博客......也许它可以提供帮助:单元测试,地狱还是天堂?
相关文章:
- 在Redux中,我应该在哪里编写复杂的异步流
- 数据绑定:'系统Char'不包含名为'xxxxx'
- 将复杂对象从angular js传递到web api,它总是返回404
- dropdown.js中的复杂事件处理
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 相当复杂的Regex
- 用Javascript重新格式化复杂文本日期字符串的更好方法
- Javascript模块系统I'I’我正在努力,但搞不明白
- 是否可以在系统/电脑浏览器中访问手机摄像头
- Node JS中的排名系统算法
- 加速我的复杂函数绘图仪(canvas+javascript)
- JQuery Mobile Javascript复杂方程式
- 任何将(SSH)终端嵌入到一些HTML5表示系统中的想法(例如,show.js)
- 如何在foreach循环中对每个产品单独应用评级系统
- Javascript-修复搜索系统
- 是否有任何设置阻止JavaScript在系统上工作
- 如何组织用户系统的Mongo集合
- 如何使用javascript过滤复杂的json对象
- 数字文件命名系统
- 如何在复杂系统中使用TDD