0

私はJavascript のスキルを向上させる方法としてEverCraft kataに取り組んでいますが、小さな問題に遭遇しました。

テストにジャスミンを使用しており、次のテストがあります。

describe("As an attacker I want to be able to damage my enemies so that they will die and I will live", function () {
    var character = null;

    beforeEach(function () {
        character = new Character();
    });

    it("If attack is successful, other character takes 1 point of damage when hit", function () {

        var beginningHitPoints = character.HitPoints,
            roll = 15;

        character.Attacked(roll);

        expect(character.HitPoints).toBe(beginningHitPoints - 1);
    });
};

character.hitPoints が 5 であるため、このテストは失敗しますが、4 であると想定しています。

Character オブジェクトのコードは次のとおりです (注: 簡潔にするために、この問題に関係のないコードをいくつか省略しています)

var Character = function () {
    var hitPoints = 5,
        ...
        attacked = function (roll) {
            var isHit = isAHit(roll);

            if (isAHit) {
                hitPoints = hitPoints - 1;
            }
        }
        ...
    ;

    return {
        ...
        HitPoints: hitPoints,
        Attacked: attacked
        ...
    };
};

何が起こっているのかを理解していると思いますが、期待どおりに機能させる方法だけではありません。を返すとき、期待どおりにHitPoints: hitPoints参照を返すのではなく、var hitPoints = 5実際には変数の値を返していると思います。言い換えれば、その宣言はHitPoints: 5

私が知りたいのは、呼び出したときにAttackedHitPoints更新された値を返す方法hitPointsです。

4

2 に答える 2

0

または、次のようなものを検討して、関数にする必要がないようにします。

 var Character = function () {
    return {
       hitPoints: 5,
       attacked: function (roll) {
        this.hitPoints = this.hitPoints - 1;
       }
    };
 };

http://jsfiddle.net/QgVMn/3

この状況でthisは、返されるオブジェクトを参照します。

于 2013-05-27T03:06:42.857 に答える
0

あなたのCharacterクラスはhitPointsプロパティを間違って使用しています. の更新された値を取得するためのゲッターが必要ですhitPoints.

var Character = function () { var hitPoints = 5, ... 攻撃 = function (roll) { var isHit = isAHit(roll);

        if (isAHit) {
            hitPoints = hitPoints - 1;
        }
    }
    ...
;

return {
    ...
    getHitPoints: function(){
        hitPoints;
    },
    Attacked: attacked
    ...
};

};

次に、次のように使用します

var beginningHitPoints = character.getHitPoints(), roll = 15;
于 2013-05-27T03:01:45.927 に答える