将AngularJS测试助手转换为包

时间:2014-07-01 12:23:00

标签: npm bower

我有几个我在几个项目中使用的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
  });
});

帮助程序本身位于规范帮助程序文件中,该文件包含在karma.conf.js

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

所以我的问题是:

  1. 帮助器作为模块注入,这有点烦人。我使用茉莉花,将它们提取到一些茉莉花助手中会很酷(例如,我不必注入一些东西来使用茉莉花和#39; expect(...)方法)。什么是正确的方法来做到这一点?因为我需要安哥拉' $q$rootScope模块,我认为在茉莉花内部它们是不可用的。我是对的吗?
  2. 我应该将整件物品装入凉亭或npm模块/包吗?
  3. 我还有一些测试助手可以扩展jQuery以进行测试。将它们捆绑成一些可重用的测试辅助模块的正确方法是什么?
  4. 欢迎任何指向教程,代码示例和资源的链接!

    更新

    目前我有以下解决方案:

    (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(...)中书写,而且您不必一次又一次地注入整个事物。

    您怎么看?这种做法好吗?或者有更好的解决方案吗?

0 个答案:

没有答案