8

JSpec Googleグループにメッセージを投稿する試みが2回失敗したようですが、代わりにここに投稿しています。

JSpecが特定の種類のテスト(以下)で無限再帰ループに入るのに問題があります。何か案は?コードに何か問題がありますか、それともJSpecですか?RubyGem経由でJSpec2.11.2を実行しています。

エラーは「RangeError:最大呼び出しスタックサイズを超えました」です。(Safari)および「InternalError:再帰が多すぎます」(FF / Mac)。Firebugコンソールを使用して、エラーなしでアイテムをルームに追加できます。

問題を再現するには、「jspecinittest」を使用してテンプレートjs​​pecプロジェクトを作成します。次に、次のファイルを次のように編集します。

yourlib.core.js

var Game = {};

Game.item = function () {
  var result = {
    name : 'Undefined',
    room : null
  }

  return result;
};

Game.room = function () {
  var result = {
    items : [],
    addItem : function (name) {
      var item = Game.item();
      item.name = name;
      item.room = this;
      this.items.push(item);

      return item;
    }
  };

  return result;
};

spec.core.js

describe 'Room'
  before_each
    room = Game.room()
  end

  describe 'addItem()'
    before_each
      potion = room.addItem('Potion')
      key = room.addItem('Key')
    end

    //this is fine
    it 'should return two different items'
      key.should_not.be potion
    end

    //InternalError: too much recursion
    it 'should not give recursion error'
      key.should.be potion
    end
  end
end
4

1 に答える 1

1

免責事項: JSpec についても聞いたことがありません (ただし、探している場合は、Jasmineが良い代替手段です。

私が考えることができる唯一のことは、「be」機能がどのように機能するかです。オブジェクト グラフをたどって 2 つのアイテムが等しいかどうかを調べる場合、循環依存関係の問題に遭遇する可能性があります。などなど。これは、be 関数がスタックを効果的にフラッディングして返すことができない無限ループになり、表示されているエラーをスローします。

このようなもの(ただし、比較なしでも:このコードをテストまたは実行していないため、上記の段落を説明するための擬似コードとして使用してください):

function be(obj) {
  for (var key in obj) {
    if (typeof(obj[key]) === "object") {
      be(obj[key]); // If you have circular dependencies, the recursion never ends
    }
  }
}
于 2012-05-20T19:28:35.270 に答える