Es6全局变量在课堂上不可用

时间:2016-02-10 14:11:47

标签: javascript mocha babeljs jsdom

我尝试在导入的课程中使我的import { jsdom } from 'jsdom'; import { assert } from 'chai'; import sinon from 'sinon'; import Pixels from './../src/pixels.es6'; let document, window, pixels; describe('Pixels', () => { beforeEach(function () { let el; document = jsdom('<html><body></body></html>'); window = document.defaultView; el = document.createElement('div'); el.setAttribute('data-flow-id', Date.now()); pixels = new Pixels(el); }); describe('spawn()', function () { beforeEach(function () { window.dataLayer = { push: sinon.spy() }; pixels.spawn(); }); afterEach(function () { window.dataLayer = {}; }); it('should push to dataLayer', function () { assert.isTrue(window.dataLayer.push.called); }); }); }); 变量可用。在它导入的类中,该窗口未定义。

我使用mocha和chai来测试我的javascript代码。也是es6部分的babeljs。

这是我的test.js:

window

这是import { URL } from './config.es6'; import Parse from './parse.es6'; import fetch from 'safe-fetch'; export default class Pixels { constructor (el) { console.log(window); this.el = el; this.fetch = fetch || window.fetch; } spawn () { this.fetch(URL, { reportChildRequestId: false, method: 'get' }).then(resp => { return resp.text(); }).then(html => { // ... do stuff with html variable }); } } 不可用的导入类:

mocha --require babel-core/register

摩卡呼叫是:window

有没有办法让Pixels变量在php app/console doctrine:mapping:convert annotation中可用,除了在构造函数中传递它?

3 个答案:

答案 0 :(得分:1)

这是奇怪的行为。 我唯一能想到的可能是这是一个行为范围问题吗?我知道它的范围权限略有不同,但我认为,因为它在全球范围内,所以这不是问题。您是否尝试使用dict代替var document, window, pixels;来查看?除此之外,我没有看到问题。我希望这可以提供一些帮助。让我知道如果你搞清楚,我其实非常好奇,谢谢!

答案 1 :(得分:1)

没有理由这样做。 window中的test.js变量在该文件的顶部范围内声明。 这不是全局的。此外,jsdom不会污染全局空间。因此,您不能指望它创建全局window

您可以通过分配给global.window来获得一些工作,但我不会这样做。如果您要测试要在浏览器中运行的代码,您应该jsdom加载它。这意味着将真实的HTML页面传递给它,引用您的脚本。

答案 2 :(得分:0)

我找到了mocha-jsdom npm包。使用此套餐,我不需要创建windowdocument,因为它会为我执行此操作并且所有内容都按预期工作。

更新的代码:

import { jsdom } from 'mocha-jsdom';
import { assert } from 'chai';
import sinon from 'sinon';
import Pixels from './../src/pixels.es6';

let pixels;

describe('Pixels', () => {

    jsdom();

    beforeEach(function () {
        let el;

        el = document.createElement('div');
        el.setAttribute('data-flow-id', Date.now());
        pixels = new Pixels(el);
    });

    describe('spawn()', function () {

        beforeEach(function () {
            window.dataLayer = {
                push: sinon.spy()
            };

            pixels.spawn();
        });

        afterEach(function () {
            window.dataLayer = {};
        });

        it('should push to dataLayer', function () {
            assert.isTrue(window.dataLayer.push.called);
        });

    });

});