2015-06-04 5 views
0

Мы используем RequireJS, Bower и npm в течение некоторого времени. Теперь мы очень впечатлены jspm и SystemJS.Как настроить SystemJS для получения новых экземпляров загрузки модулей в тестовый набор Jasmine

Нам нравится, что они:

  • работа с AMD минимизировать боль преобразования нашего существующего кода
  • позволяет писать ES2015 модули, используя новые возможности
  • имеет подобный конфигурационный файл как RequireJS который они поддерживать.
  • позволяют вытащить из узла LIBS и GitHub, которые не должны быть зарегистрированы в беседке

Единственное, что мы можем найти, что запрещая нам сделать переключатель, является то, что нам нужно средство извещать 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); 

И тогда мы называем createRequireContext в тестовом Jasmine Suite:

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?

ответ

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'); 
     }); 
    }); 
}); 

Здесь вы можете увидеть working project Это написано в машинописном, но с ES6 так ли работает очень похоже. Вы можете отказаться от поддержки TS (типы, декораторы и несколько бонусов) изменить транспилятор на babel и расширения файлов на * .js;)

+0

Хотя я большой поклонник модулей ES6 с ключевыми словами импорта и экспорта, m не очень любитель классов ES6. Я предпочитаю композицию объекта с помощью шаблона раскрывающего модуля. В результате я ищу решение, которое не требует от меня новых объектов повсюду. – cResults

 Смежные вопросы

  • Нет связанных вопросов^_^