在节点的mocha js中使用全局窗口变量

iva*_*van 13 javascript mocha.js node.js backbone.js chai

我是js单元测试的新手,我正在尝试使用mocha作为我在这个github repo上找到的骨干联系管理器教程.但是,我有一个全局window.ContactManager变量,我想要测试它是否存在,然后测试启动函数内的router.on功能.变量看起来像这样:

  window.ContactManager = {
  Models: {},
  Collections: {},
  Views: {},

  start: function(data) {
    var contacts = new ContactManager.Collections.Contacts(data.contacts),
        router = new ContactManager.Router();

    router.on('route:home', function() {
      router.navigate('contacts', {
        trigger: true,
        replace: true
      });
    });

    router.on('route:showContacts', function() {
      var contactsView = new ContactManager.Views.Contacts({
        collection: contacts
      });
.....
Run Code Online (Sandbox Code Playgroud)

我的测试不起作用:var expect = require('chai').expect;

describe("Application", function() {
    it('creates a global variable for the name space ContactManager' , function () {
        expect(ContactManager).to.exist;
    })
});
Run Code Online (Sandbox Code Playgroud)

如何通过在控制台中运行测试来测试和访问mocha中的全局窗口变量?

Lou*_*uis 13

您忽略了在浏览器中运行JavaScript代码和在Node中运行JavaScript代码之间的区别.

在浏览器中,window名称是对象的引用,该对象包含所有全局变量.因此,当您foo = 1在最外层范围内执行时,您将声明一个全局foo,也可以作为window.foo.相反,如果您指定一个像这样的新字段:window.bar = 1,那么您将调用一个新的全局字段bar.

在Node中,您的全局对象被访问为global.因此,如果您foo = 1在最外层范围内,foo也可以访问global.foo.如果你这样做global.bar = 1,你就有了一个新的全球名称bar.

您的代码显示您修改了一个window对象,该对象似乎不是对全局对象的引用.选项:

  1. 在浏览器中运行Mocha而不是在Node中运行.请参阅Mocha的文档.

  2. 设置您的Node环境,使其模仿足够的浏览器环境以满足节点.将全局window变量设置为等于global 可能就足够了但我不知道Backbone是否足以知道Backbone是否会对此感到满意.

  3. jsdom中运行基于Backbone的代码.Jsdom提供真实的windowdocument,因为如果你的代码在浏览器中运行,但它也有其局限性.我不知道Backbone是否会满意这些限制.