测试Promular而不是AngularJS中的回调

时间:2014-08-16 14:18:21

标签: javascript angularjs

我正在学习AngularJS。我正在努力学习各种概念,包括承诺。通常,我会使用回调。现在我正在尝试使用promises,我正试图弄清楚如何在这个新世界中编写测试。这时,我有:

describe('myModule', function() {
  beforeEach(function() {
    module('myModule');
  });

  describe('myService', function () {
    var myService = null;
    beforeEach(inject(function (myService) {
      myService = myService;
    }));

    it('should do my bidding', function () {
      myService.myFunction().then(
        function() { expect(true).toBe(true); },
        function() { expect(false).toBe(false); }
      );
    });
  });
});

myService看起来像这样:

myApp.factory('myService', ['$q', function($q) {
    return {
        myFunction: function() {
            var defer = $q.defer();
            defer.resolve();
            return defer.promise;
        }
    };
}]);

基本上,此服务始终可以解决。但是,我无法让我的测试失败。即使我将第一个expect更改为false。我看到一个日志条目说:

log: Spec 'myModule myService should do my bidding' has no expectations.

就像then中的断言没有执行一样。我误解了什么?

由于

1 个答案:

答案 0 :(得分:1)

要测试异步代码,您必须在done函数中接受it参数,并在测试真正完成时调用它。

您还必须致电$rootScope.$digest()来调用then回调。

因此,测试至少应该是这样的:

it('should do my bidding', function(done) {
  myService.myFunction().then(
    function() { expect(true).toBe(true); },
    function() { expect(false).toBe(false); }
  ).finally(function() {
    done();
  });

  $rootScope.$digest();
});

示例Plunker: http://plnkr.co/edit/h68W1IEpAqe6kJwEG6in?p=preview