gpt4 book ai didi

javascript - 如何在复杂系统中使用TDD?

转载 作者:行者123 更新时间:2023-11-28 13:51:03 24 4
gpt4 key购买 nike

所以我一直在制作一款游戏,直到我想尝试 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 将确保您的代码易于测试,这样您就可以享受单元测试的所有好处。

我前段时间写了一篇关于单元测试的博客..也许它可以帮助:Unit Testing, hell or heaven?

关于javascript - 如何在复杂系统中使用TDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com