【问题标题】:How do I write a jasmine test for a method that contains a global variable from another class/file?如何为包含来自另一个类/文件的全局变量的方法编写 jasmine 测试?
【发布时间】:2011-12-31 21:10:48
【问题描述】:

我的测试失败了,原因如下:

ReferenceError:找不到变量:文件中的moving_canvas_context (第 5 行)

我了解测试失败的原因。它不理解该变量,因为它是在单独的 JavaScript 文件中定义的。但是,它是全局声明的,并且在现实中有效。

如何为 clear_canvas 函数编写 jasmine 测试?

JavaScriptCanvas_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 的 Jasmine 测试:

(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);

【问题讨论】:

    标签: javascript unit-testing testing fixtures jasmine


    【解决方案1】:

    Jordão 绝对正确,但也有一个丑陋的选择。
    在 beforeEach 方法中将全局对象附加到窗口。下面的代码可能不起作用(尚未测试),但应该足以理解如何解决这个 jasmine 全局对象问题。

    (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 的cmets,显然可能存在错误(ReferenceError: window is not defined)来修复它而不是window 使用global,例如:@ 987654325@改成global.Canvas_Actions

    【讨论】:

    • 这不起作用。当我运行npm test 时,我收到错误“ReferenceError:未定义窗口”。我猜茉莉花在无头浏览器中运行,所以没有任何窗口。
    • @JohnHenckel:见下文
    【解决方案2】:

    它seems like JasmineJS 使用global 属性。所以@Jordão 的回答不顾一切,你可以替换

    window.Canvas_Actions = (function() {
    

    与

    global.Canvas_Actions = (function() {
    

    【讨论】:

      【解决方案3】:

      它在全局范围内声明并在现实中工作

      嗯,它还需要在测试运行时声明。因此,您可能缺少对在测试夹具 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();
      };
      

      您可以使用 jasmine 模拟 canvas 参数并单独测试 Canvas_Actions。

      可以注意到,这段代码可能发现 Canvas 类,您可能会发现clear_canvas 属于其中。一次一步地使用测试来指导您的设计。

      【讨论】:

      • 谢谢。你的回答很有帮助。按照您的示例,如果我删除所有全局引用,您将如何测试诸如 clearRect 或 drawImage 之类的处理画布上绘图的方法?模拟?
      • 是的,孤立地模拟您的对象,但更多的集成样式检查处理外部对象的对象。这些只是测试外部对象并检查其状态是否符合测试中的预期行为。
      猜你喜欢
      • 2021-07-03
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 2011-10-09
      • 1970-01-01
      相关资源
      最近更新 更多