[英]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
window
: window.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.