0

だから、私は 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" );
});

全体的に雰囲気が悪いです。心を包み込むのは難しく、維持するのは難しいと思います。

4

1 に答える 1

5

TDD 以外の方法で単体テストを作成する場合は、作成するコードの各部分について、「これをテストするにはどうすればよいか」と自問する必要があります。これにより、コードを調べて、テスト時にすべての依存関係を置き換えることができることを確認する必要があります。

TDD を行う場合、この「これをテストするにはどうすればよいか」が最初から組み込まれています。プロジェクトの途中で TDD を導入すると、すべての依存関係を置き換えることができない場合に問題が発生します。

単体テストを行うときは、単体を完全に分離してテストし、すべての依存関係をモックまたはフェイクに置き換えることができることを確認する必要があります。次に、単体テストへのすべての入力を制御できるため、すべてのコード パスがテストされていることを確認できます。

プロジェクトで単体テストを機能させるには、実際に単体テストをサポートするようにコードをリファクタリングする必要があります。

この場合、TDD は主な問題ではないと思います。問題は、単体テストをまったく使用するかどうかです。その質問に対する答えは「はい」であるべきだと思います! 単体テストには多くの利点があります。ここで、作成したコードをテストするのが難しいという問題に直面します。コードがテスト可能であることを確認することは、コードを記述した後に実行できることですが、今経験しているように、それは非常に困難です。それが、TDD が役立つポイントです。TDD を使用すると、コードを簡単にテストできるようになるため、単体テストのすべての利点を得ることができます。

少し前に単体テストについてブログを書きました..多分それが役立つかもしれません:単体テスト、地獄か天国か?

于 2012-06-09T07:59:06.257 に答える