0

私たちはかなり長い間、RequireJS、Bower、および npm を使用してきました。今では、jspm と SystemJS に非常に感銘を受けています。

私たちは彼らが好きです:

  • AMD と連携して、既存のコードを変換する手間を最小限に抑えます
  • 新しい機能を利用して ES2015 モジュールを作成できるようにする
  • 彼らが維持しているRequireJSと同様の構成ファイルがあります。
  • bower に登録する必要のない Node と GitHub からライブラリをプルできるようにする

切り替えを妨げている唯一の理由は、Jasmine テスト スイートを含むモジュールにロードされる必要なモジュールの新しいインスタンスを SystemJS に提供するように指示する手段が必要なことです。

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 サポート (タイプ、デコレーター、その他いくつかのボーナス) をドロップして、transpiler を babel に変更し、ファイル拡張子を *.js に変更できます ;)

于 2015-10-10T16:37:00.787 に答える