7

私のテストは次の理由で失敗します:

ReferenceError:変数が見つかりません:ファイル内のmoving_canvas_context(5行目)

テストが失敗する理由を理解しています。別のJavaScriptファイルで定義されているため、変数を理解しません。ただし、グローバルに宣言されており、実際に機能します。

clear_canvasこの関数のジャスミンテストを作成するにはどうすればよいですか?

JavaScript Canvas_Actions

(function() {
  window.Canvas_Actions = (function() {
    function Canvas_Actions() {}
    Canvas_Actions.prototype.clear_canvas = function() {
      moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height);
      main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height);
      return window.canvas_objects = [];
    };
    return Canvas_Actions;
  })();
}).call(this);

ジャスミンテストCanvas_Actions

(function() {
  describe('Canvas Actions', function() {
    return describe('clear_canvas', function() {
      return it('clears the canvases and deletes all objects', function() {
        var actions;
        jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures";
        loadFixtures("canvas_fixture.html");
        actions = new Canvas_Actions();
        actions.clear_canvas();
        return expect(canvas_objects).toEqual([]);
      });
    });
  });
}).call(this);
4

3 に答える 3

11

それはグローバルに宣言され、実際に機能します

また、テストの実行時に宣言する必要があります。したがって、テストフィクスチャのhtmlで定義されているスクリプトへの参照が欠落している可能性があります。

また、グローバル変数は通常は良い考えではなく、難しいバグを作成する傾向があります。すでにテストフレームワークとしてjasmineを使用しているので、テスト対象のコードに渡すもので、そのグローバル変数への依存関係を抽象化してみてください。次に、ジャスミンのモック能力を使用してテストします。

からグローバル参照を削除すると、次のCanvas_Actionsようになります。

var Canvas_Actions = function(canvas) { 
  this.canvas = canvas; 
}
Canvas_Actions.prototype.clear_canvas = function(background_image) {
  var canvas = this.canvas;
  canvas.getContext().clearRect(0, 0, canvas.width, canvas.height);
  canvas.getContext().drawImage(background_image, 0, 0, canvas.width, canvas.height);
  canvas.clearObjects();
};

あなたはcanvasジャスミンで議論をあざけりCanvas_Actions、単独でテストすることができます。

注目できるように、このコードはクラスを発掘する可能性があり、そこに属するCanvasクラスを見つける可能性があります。clear_canvasテストを使用して、一度に1ステップずつ設計をガイドします。

于 2011-11-18T01:44:55.577 に答える
4

Jordãoは絶対に正しいですが、醜いオプションもあります。
beforeEachメソッドのウィンドウにグローバルオブジェクトをアタッチします。以下のコードはおそらく機能しません(テストされていません)が、このジャスミングローバルオブジェクトの問題を回避する方法を理解するには十分なはずです。

(function() {
  describe('Canvas Actions', function() {
    beforeEach(function () {
        window.Canvas_Actions = (function() {
function Canvas_Actions() {}
Canvas_Actions.prototype.clear_canvas = function() {
  moving_canvas_context.clearRect(0, 0, moving_canvas.width, moving_canvas.height);
  main_canvas_context.drawImage(window.background_image, 0, 0, main_canvas.width, main_canvas.height);
  return window.canvas_objects = [];
};
return Canvas_Actions;
})();
    });
return describe('clear_canvas', function() {

  return it('clears the canvases and deletes all objects', function() {
    var actions;
    jasmine.getFixtures().fixturesPath = "../spec/javascript/fixtures";
    loadFixtures("canvas_fixture.html");
    actions = window.Canvas_Actions;
    actions.clear_canvas();
    return expect(canvas_objects).toEqual([]);
  });
});
  });
}).call(this);

編集: @John Henckelと@serv-incのコメントによると、次のように使用ReferenceError: window is not definedする代わりに、修正するためのエラー()がある可能性があります。windowglobalwindow.Canvas_Actionsglobal.Canvas_Actions

于 2014-04-14T13:35:30.683 に答える
3

JasmineJSがプロパティを使用しているようglobalです。だから@Jordãoの答えにもかかわらず、あなたは置き換えることができます

window.Canvas_Actions = (function() {

global.Canvas_Actions = (function() {
于 2019-06-26T10:08:02.610 に答える