Превратить AngularJS test helper в пакет

#npm #bower

#npm #беседка

Вопрос:

У меня есть куча помощников по тестированию для angularjs, которые я использую в нескольких проектах. Я хочу упаковать их в модуль / пакет npm или bower, чтобы легко использовать их повторно и делиться ими. Но я не уверен, как правильно это сделать.

Помощник выглядит следующим образом:

 (function() {
  var spyHelper = angular.module("spyHelper", []);
  spyHelper.factory("spyOnPromise", ["$q", "$rootScope", function($q, $rootScope) {
    return function(service, functionName, args) {
      var deferred = $q.defer();
      var spy = spyOn(service, functionName).andReturn(deferred.promise);
      spy.resolve = function(value) {
        deferred.resolve(value);
        $rootScope.$apply();
        return spy;
      }
      spy.reject = function(value) {
        deferred.reject(value);
        $rootScope.$apply();
        return spy;
      }
      return spy;
    }
  }]);
  beforeEach(module("spyHelper"));
})();
  

И он используется в моих тестах следующим образом:

 describe('myService', function () {
  beforeEach(module('myApp'));

  var spyOnPromise, myService;
  beforeEach(inject(function(_spyOnPromise_, _myService_) {
    spyOnPromise = _spyOnPromise_;
    myService = _myService_;
  }));

  it("should revolve a promise", function() {
    spyOnPromise(myService, "fetch").resolve();
    // ... do some other stuff
  });
});
  

Сам помощник находится в файле spec helper, который включается внутрь karma.conf.js :

 files: [
  // ....
  'test/helper/**/*.js',
  // ...
],
  

Итак, мои вопросы:

  1. Помощник вводится как модули, и это немного раздражает. Я использую jasmine, и было бы здорово извлечь их в некоторые помощники jasmine (например, мне не нужно вводить что-либо, чтобы использовать expect(...) метод jasmines).). Как правильно это сделать? Потому что мне нужны модули angulars $q и $rootScope , и я думаю, что внутри jasmine они были бы недоступны. Я прав?
  2. Должен ли я упаковать все это в беседку или модуль / пакет npm?
  3. У меня также есть несколько тестовых помощников, которые расширяют jQuery для целей тестирования. Каков был бы правильный способ объединить их в некоторые повторно используемые модули test helper?

Любые ссылки на учебные пособия, примеры кода, ресурсы приветствуются!

Обновить

В настоящее время у меня есть следующее решение:

 (function() {
  var injector = angular.injector(['ng']);
  var $q = injector.get("$q");
  var $rootScope = injector.get("$rootScope");

  this.spyOnPromise = function(service, functionName, args) {
    var deferred = $q.defer();
    var spy = spyOn(service, functionName).andReturn(deferred.promise);
    spy.andResolveWith = function(value) {
      deferred.resolve(value);
      $rootScope.$apply();
      return spy;
    };
    spy.andRejectWith = function(value) {
      deferred.reject(value);
      $rootScope.$apply();
      return spy;
    };
    return spy;
  };
}).call(this);
  

С помощью этого решения вы можете просто записывать свои тесты spyOnPromise(...) , и вам не нужно вводить все это снова и снова.

Как вы думаете, этот подход подходит? Или есть лучшее решение?