我该如何在Jasmine中使用window对象?

4

我正在尝试在Jasmine测试中使用window对象。

在测试文件loader_spec.s中,我有:

use strict;
var setupModuleLoader = require(../src/loader);

describe("setupModuleLoader", function() {
    it(exposes angular on the window, function() { 

      setupModuleLoader(window); 
      expect(window.angular).toBeDefined();

    }); 
});

我在 loader.js 文件中有以下内容:

use strict;

function setupModuleLoader(window) {
  var angular = window.angular = {}; //creates empty angular object in browser's `window`
}

module.exports = setupModuleLoader;

当我运行测试时,会出现参考错误,提示window未定义。

我正在使用这个样板文件进行测试,该样板文件使用PhantomJS。


当使用Jasmin时,angular将作为全局变量已经可用。请检查使用inject来加载模块。 - Matthew.Lothian
有没有办法使用浏览器窗口对象?为了提供一些背景,我正在按照一本从头开始构建AngularJS的书籍进行操作,因此我实际上并没有使用AngularJS库。 - Paul43
it 函数的第一个参数应该是字符串吗?还是这个是打字错误? - Matthew.Lothian
你是在浏览器还是控制台中运行Jasmine测试? - RIYAJ KHAN
我正在控制台中运行它。没有打错字。 - Paul43
2个回答

0

好的,window对象代表浏览器窗口。如果您从浏览器运行jasmine单元测试,则该对象在您的脚本中可用,否则不可用。

从控制台运行意味着您正在从脚本主机运行JavaScript。因此,主机无法找到Window对象。

浏览器选项不包括全局对象window和self的别名。

例如:browsers: ['Chrome']


0
如果你想要访问 window 对象,你需要确保你的测试在浏览器中运行,而不是在 node.js 中。
$ gulp test:unit

在所提到的boilerplate中,任务运行普通的mocha测试,并不会启动浏览器。如果要访问window和其他特定于浏览器的对象,您应该将测试放置在/tests/integration目录中,并像这样运行它们:

$ gulp test:integration

将代码单元与执行上下文松散耦合是一个好的实践,这就是为什么样板中的单元测试不会启动浏览器。它们不希望代码单元了解 window 或其他浏览器对象。

解决代码依赖于某些外部内容的另一种方法是为其依赖项创建模拟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接