我的测试因以下原因而失败:
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的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);
答案 0 :(得分:9)
它在全球范围内宣布并且在现实中起作用
嗯,还需要在测试运行时声明它。所以你可能错过了对测试夹具html中定义的脚本的引用。
此外,全局变量通常不是一个好主意,它们往往会产生困难。由于您已经在使用jasmine作为测试框架,因此尝试在传递给测试代码的内容中抽象出对该全局变量的依赖性。然后,使用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
属于那里。使用测试来指导您的设计,一步一步。
答案 1 :(得分: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);
答案 2 :(得分:1)
seems like JasmineJS使用global
属性。因此,尽管有@Jordão的回答,您也可以替换
window.Canvas_Actions = (function() {
使用
global.Canvas_Actions = (function() {