ES6/Mocha包含文件

ES6/Mocha Include Files

本文关键字:文件 包含 Mocha ES6      更新时间:2023-09-26

我对ES6导出/导入语法很陌生,我想知道如何在我的indexTest.js文件中动态导入带有测试的文件。

我有两个带有测试的文件。

PeopleTest.js

/* global it, describe, before, after */
/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
import chai, { expect } from 'chai';
import dirtyChai from 'dirty-chai';
chai.use(dirtyChai);
describe('People tests', () => {
  it('Mock', () => {
    expect(true).to.be.true();
  });
});

PostTest.js

/* global it, describe, before, after */
/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
import chai, { expect } from 'chai';
import dirtyChai from 'dirty-chai';
chai.use(dirtyChai);
describe('Post tests', () => {
  it('Mock', () => {
    expect(true).to.be.true();
  });
});

我想要一个全局文件来导入这两个文件

indexTest.js

/* global it, describe, before, after */
/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
import chai, { expect } from 'chai';
import dirtyChai from 'dirty-chai';
chai.use(dirtyChai);
describe('All tests', () => {
  before(() => {
    // some stuff
  });
  after(() => {
    // some stuff
  });
  import './PeopleTest';
  import './PostTest';
});

但是它当然不能工作,因为import语句应该在顶层。

你可以按照coding阴谋在评论中建议的那样调用require而不是使用import。然而,这需要对运行时环境做一个假设,而这个假设可能并不总是成立。例如,如果你将ES6代码编译到使用AMD语义加载模块的环境中,那么describe中的require将被解释为好像它位于import语句的顶部,并且你不会得到你想要的结果。

得到你想要的东西的一种方法,不需要假设ES6模块加载语义之外的任何东西,只需修改你导入的两个模块,以便它们导出一个函数来创建它们想要运行的测试,然后在需要的地方调用该函数。

要导入的模块之一可以是:

/* global it, describe, before, after */
/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
import chai, { expect } from 'chai';
import dirtyChai from 'dirty-chai';
export default function peopleTest() {
  chai.use(dirtyChai);
  describe('People tests', () => {
    it('Mock', () => {
      expect(true).to.be.true();
    });
  });
};

你的主测试文件可以变成:

/* global it, describe, before, after */
/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
import chai, { expect } from 'chai';
import dirtyChai from 'dirty-chai';
import peopleTest from './PeopleTest';
import postTest from './PostTest';
chai.use(dirtyChai);
describe('All tests', () => {
  before(() => {
    // some stuff
  });
  after(() => {
    // some stuff
  });
  peopleTest();
  postTest();    
});

只能在HTML页面中包含脚本文件,而不能在另一个脚本文件中包含脚本文件。也就是说,您可以编写JavaScript将"包含"脚本加载到同一页面:

var imported = document.createElement('script');
imported.src = '/path/to/imported/script';
document.head.appendChild(imported);

有一个很好的机会,你的代码依赖于你的"包含"脚本,然而,在这种情况下,它可能会失败,因为浏览器将异步加载"导入"的脚本。您最好的选择是简单地使用第三方库,如jQuery或YUI,它可以为您解决这个问题。

// jQuery
$.getScript('/path/to/imported/script.js', function()
{
    // script is now loaded and executed.
    // put your dependent JS here.
});

from this question