javascript 如何为包含来自另一个类/文件的全局变量的方法编写 jasmine 测试?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8176753/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I write a jasmine test for a method that contains a global variable from another class/file?
提问by John
My tests fails for the following reason:
我的测试失败的原因如下:
ReferenceError: Can't find variable: moving_canvas_context in file (line 5)
ReferenceError:找不到变量:文件中的moving_canvas_context(第5行)
I understand the reason the test is failing. It doesn't understand the variable since it is defined in a separate JavaScript file. However, it is declared globally and works in reality.
我了解测试失败的原因。它不理解该变量,因为它是在单独的 JavaScript 文件中定义的。但是,它是全局声明的并且在现实中有效。
How do I write a jasmine test for this clear_canvas
function?
如何为此clear_canvas
功能编写茉莉花测试?
JavaScript Canvas_Actions
:
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);
Jasmine Test for Canvas_Actions
:
茉莉花测试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);
回答by Jord?o
it is declared globally and works in reality
它在全球范围内声明并在现实中起作用
Well, it also needs to be declared when the test runs. So you're probably missing a reference to the script where it is defined in the testing fixture html.
那么,它也需要在测试运行时声明。因此,您可能缺少对测试夹具 html 中定义的脚本的引用。
Also, global variables are normally not a good idea, they tend to create difficult bugs. Since you're already using jasmine as a testing framework, try to abstract the dependency on that global variable in something that you pass to your code under test. Then, use jasmine's mocking abilities to test it.
此外,全局变量通常不是一个好主意,它们往往会产生困难的错误。由于您已经在使用 jasmine 作为测试框架,因此请尝试在传递给被测代码的内容中抽象对该全局变量的依赖关系。然后,用茉莉花的嘲讽能力来测试一下。
If you remove the global references from Canvas_Actions
, it could look like this:
如果您从 中删除全局引用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();
};
You can mock the canvas
argument with jasmine and test Canvas_Actions
in isolation.
你可以canvas
用 jasmine来模拟这个论点并单独测试Canvas_Actions
。
As can be noted, this code might uneartha Canvas
class, and you might find out that clear_canvas
belongs in there. Use the tests to guide your design, one step at a time.
可以注意到,这段代码可能会挖掘出一个Canvas
类,您可能会发现它clear_canvas
属于那里。使用测试指导您的设计,一次一个步骤。
回答by Matas Vaitkevicius
Jord?o is absolutely right, however there's an ugly option too.
Attach your global object to the window in beforeEach method. Code below probably does not work (haven't tested it), but should be good enough to understand how to work around this jasmine global object problem.
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);
EDIT:as per comments by @John Henckel and @serv-inc apparently there might be an error (ReferenceError: window is not defined
) to fix it instead of window
use global
like: window.Canvas_Actions
change to global.Canvas_Actions
编辑:根据@John Henckel 和@serv-inc 的评论,显然可能有一个错误 ( ReferenceError: window is not defined
) 来修复它而不是window
使用global
像:window.Canvas_Actions
更改为global.Canvas_Actions
回答by serv-inc
It seems likeJasmineJS uses the global
property. So @Jord?o's answer nonwithstanding, you could replace
这似乎是JasmineJS使用global
属性。所以@Jord?o 的回答尽管如此,你可以替换
window.Canvas_Actions = (function() {
with
和
global.Canvas_Actions = (function() {