0

我们使用 RequireJS、Bower 和 npm 已经有一段时间了。现在我们对 jspm 和 SystemJS 印象深刻。

我们喜欢他们:

  • 与 AMD 合作,最大限度地减少转换现有代码的痛苦
  • 允许我们利用新特性编写 ES2015 模块
  • 有一个与他们维护的 RequireJS 类似的配置文件。
  • 允许我们从 Node 和 GitHub 中提取不需要在 bower 注册的库

我们能找到的唯一禁止我们进行切换的事情是,我们需要一种方法来告诉 SystemJS 为我们提供所需模块的新实例,这些实例被加载到包含 Jasmine 测试套件的模块中。

使用 RequireJS,我们通过像这样向窗口添加一个 createRequireContext 来做到这一点

(function (window) {
    var contextId = 0;

    window.createRequireContext = function () {
        var config = $.extend(true, window.globalRequireConfig, {
            baseUrl: '/base/src',
            context: 'new-context' + contextId++,
            paths: {
                'testData': '../test/data',
                'testFiles': '../test/testFiles'
            }
        }), 
        context = requirejs.config(config);

        return context.apply(this, arguments);
    };
})(window);

然后我们在 Jasmine 测试套件中调用 createRequireContext:

define(function () {
    var simpleObject;

    describe('new context for each test', function () {
        beforeEach(function (done) {
            createRequireContext(['testFiles/SimpleObjectModule'], function (newSimpleObject) {
                simpleObject = newSimpleObject;
                done();
            });
        });

        describe("createRequireContext", function () {
            it("retrieves a module with a new context and change a variable", function () {
                expect(simpleObject.foo).toBe('bar');
                simpleObject.foo = 'Old Data';
                expect(simpleObject.foo).toBe('Old Data');
            });
            it("retrieves a module with a new context and has original value", function () {
                expect(simpleObject.foo).toBe('bar');
            });
        });
    });

    describe('new context for each test suite', function () {
        beforeAll(function (done) {
            createRequireContext(['testFiles/SimpleObjectModule'], function (newSimpleObject) {
                simpleObject = newSimpleObject;
                done();
            });
        });

        describe("createRequireContext", function () {
            it("retrieves a module with a new context and change a variable", function () {
                expect(simpleObject.foo).toBe('bar');
                simpleObject.foo = 'New Data';
                expect(simpleObject.foo).toBe('New Data');
            });
            it("retrieves a module with a new context and has changed value", function () {
                expect(simpleObject.foo).toBe('New Data');
            });
        });
    });
});

在 beforeEach 中创建一个新的上下文会隔离每个测试所需的模块。在 beforeAll 中创建一个新的上下文可以将所需的模块与其他测试套件中的使用隔离开来。

有没有办法可以用 SystemJS 和 jspm 做到这一点?

4

1 回答 1

0

我知道的唯一方法是在 ES6 中编写测试,然后在测试文件中导入模块:

import {SimpleObject} from '../../../src/SimpleObject';

let simpleObject;

describe('new context for each test',() => {
    beforeEach(() => {
          simpleObject = new SimpleObject();
    });

    describe("createRequireContext", () => {
        it("retrieves a module with a new context and change a variable", () => {
            expect(simpleObject.foo).toBe('bar');
            simpleObject.foo = 'Old Data';
            expect(simpleObject.foo).toBe('Old Data');
        });
        it("retrieves a module with a new context and has original value", function () {
            expect(simpleObject.foo).toBe('bar');
        });
    });
});

在这里你可以看到正在工作的项目它是用 TypeScript 编写的,但在 ES6 中它的工作原理非常相似。您可以放弃对 TS 的支持(类型、装饰器和更多奖励)将转译器更改为 babel 并将文件扩展名更改为 *.js ;)

于 2015-10-10T16:37:00.787 回答