繁体   English   中英

如何为包含另一个类/文件中的全局变量的方法编写茉莉花测试?

[英]How do I write a jasmine test for a method that contains a global variable from another class/file?

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

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

它已在全球范围内宣布并在现实中起作用

好了,测试运行时也需要声明它。 因此,您可能缺少对在测试装置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_Actions

可以注意到,此代码可能会挖掘 Canvas类,并且您可能会发现clear_canvas属于该类。 使用测试一次指导您的设计。

乔丹(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 )来修复它,而不是使用window global windowwindow.Canvas_Actions更改为global.Canvas_Actions

看起来 JasmineJS使用了global属性。 因此,尽管有@Jordão的回答,您也可以替换

window.Canvas_Actions = (function() {

global.Canvas_Actions = (function() {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM