首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在复杂系统中使用TDD?

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

Stack Overflow用户
提问于 2012-06-09 15:48:12
回答 1查看 175关注 0票数 0

所以我一直在做一个游戏,直到我想尝试TDD,所以我的大部分工作代码都没有任何测试,但我想为每个新功能尝试TDD。

我的问题是我的游戏由大量相互依赖的系统组成(就像我不能在没有关卡的情况下使用相机一样,对象保留了大量的引用,初始化的东西以其他东西为参数)。所以,为了测试雾系统,我需要初始化级别,物理,相机,碰撞(因为它们都在某种程度上相互依赖),这会产生大量的重复。代码如下:

代码语言:javascript
复制
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" );
});

总体而言,它有一种不好的感觉。我认为,它更难让我的头脑保持清醒,也更难维护。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 15:59:06

当以非TDD方式编写单元测试时,您必须为您编写的每段代码问自己:“我如何测试它”。这迫使您查看您的代码,并确保在测试时可以替换所有依赖项。

在做TDD时,“我如何测试这个”这句话从一开始就被灌输进去了。当您无法替换所有依赖项时,在项目中间引入TDD会导致问题。

在进行单元测试时,您需要确保可以在完全隔离的情况下测试单元,并将所有依赖项替换为mock或fake。然后,您可以控制单元测试的所有输入,从而确保所有代码路径都经过了测试。

要使单元测试在您的项目中工作,您必须重构您的代码以真正支持单元测试。

我认为TDD不是这种情况下的主要问题。问题是,如果你想使用单元测试,我认为这个问题的答案应该是肯定的!单元测试有很多优点。现在,您面临的问题是您编写的代码很难测试。确保代码是可测试的是可以在编写代码之后完成的事情,但正如您现在所经历的那样,这是相当困难的。这就是TDD可以提供帮助的地方。TDD将确保您的代码易于测试,因此您可以享受单元测试的所有好处。

前段时间我写了一篇关于单元测试的博客。也许它能帮上忙:Unit Testing, hell or heaven?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10959334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档