在服务中使用firebase/mockfirebase进行AngularJS测试

dev*_*_al 5 unit-testing angularjs angularfire karma-jasmine

我一直在尝试为我的服务编写一些单元测试,这些测试使用AngularFire与Angular网站内的Firebase进行通信.

我是AngularJS的新手,所以我觉得我错过了一些显而易见的东西,但在网上找不到任何好的例子(至少没有说到我有限的知识).

我在MockFirebase https://github.com/katowulf/mockfirebase/tree/master/tutorials上找到了一些有限的文档,并展示了如何模拟数据,所以我这样做了.

有关mockfirebase的更多示例,我查看了角火的单元测试https://github.com/firebase/angularfire/tree/master/tests/unit 但这似乎并没有向我展示正确的方法.

这是我的服务 -

app.service('Subscription', function ($firebase, FIREBASE_URL, $q) {

var ref;
var Subcription = {
ref: function () {
  if (!ref) ref = new Firebase(FIREBASE_URL + "/subscriptions");
  return ref;
},

validateSubscription: function(userId){
  var defer = $q.defer();

  $firebase(Subcription.ref().child(userId))
    .$asObject()
    .$loaded()
    .then(function (subscription) {
      defer.resolve(subscription.valid === true);
    });

  return defer.promise;
},

recordSubscription: function(userId){
  return Subcription.ref().$set(userId, {valid: true});
}

};

 return Subcription;

});
Run Code Online (Sandbox Code Playgroud)

这是spec文件 -

describe('Service: subscription', function () {

  // load the service's module
  beforeEach(module('clientApp'));

  // instantiate service
  var subscription;
  var scope;
  beforeEach(inject(function (_Subscription_, $rootScope) {
    MockFirebase.override();
    subscription = _Subscription_;
    scope = $rootScope.$new();
  }));

  it('allows access when the user id is in the subscription list', function () {
    subscription.ref().push({'fakeUser': {valid: true}});
    subscription.ref().flush();

    var handler = jasmine.createSpy('success');
    subscription.validateSubscription('fakeUser').then(handler);

    scope.$digest();
    expect(handler).toHaveBeenCalledWith(true);
  });

});
Run Code Online (Sandbox Code Playgroud)

似乎问题是承诺永远不会在$ asobject内部得到解决.$ load因为angularfire部分没有发生.

作为测试的结果,我得到了以下内容:'预期间谍成功被调用[true],但它从未被调用过.