我尝试在导入的课程中使我的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
中可用,除了在构造函数中传递它?
答案 0 :(得分:1)
这是奇怪的行为。
我唯一能想到的可能是这是一个行为范围问题吗?我知道它的范围权限略有不同,但我认为,因为它在全球范围内,所以这不是问题。您是否尝试使用dict
代替var document, window, pixels;
来查看?除此之外,我没有看到问题。我希望这可以提供一些帮助。让我知道如果你搞清楚,我其实非常好奇,谢谢!
答案 1 :(得分:1)
没有理由这样做。 window
中的test.js
变量在该文件的顶部范围内声明。 这不是全局的。此外,jsdom
不会污染全局空间。因此,您不能指望它创建全局window
。
您可以通过分配给global.window
来获得一些工作,但我不会这样做。如果您要测试要在浏览器中运行的代码,您应该jsdom
加载它。这意味着将真实的HTML页面传递给它,引用您的脚本。
答案 2 :(得分:0)
我找到了mocha-jsdom npm包。使用此套餐,我不需要创建window
和document
,因为它会为我执行此操作并且所有内容都按预期工作。
更新的代码:
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);
});
});
});