ES6/Mocha 包含文件

ES6/Mocha Include Files

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

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

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 语句应该在顶层。

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

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

您的代码很有可能依赖于您的 "included" 脚本,但是,在这种情况下它可能会失败,因为浏览器将异步加载 "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

您可以执行 并调用 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();    
});