javascript - 在 AngularJS 中测试 Promise 而不是回调

标签 javascript angularjs

我正在学习 AngularJS。我正在尝试了解包括 promise 在内的各种概念。通常,我会使用回调。现在我正在尝试使用 promise ,我正在尝试弄清楚如何在这个新世界中编写测试。此时,我有:

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中的断言没有执行。我有什么误解吗?

谢谢

最佳答案

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

您还必须调用 $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

关于javascript - 在 AngularJS 中测试 Promise 而不是回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25341026/

相关文章:

java - <jsp :forward> or <jsp:include> actions in a JSP needs buffering to be enabled?

javascript - 预加载器动画不起作用

javascript - jQuery 复选框选择器问题

javascript - 在 Angular JS With Wcf Service 的飞行前响应中,Access-Control-Allow-Methods 不允许方法 PUT

javascript - 在 Javascript 函数执行期间更新 DOM

javascript - 使用 AngularJS 中的点读取 JSON 变量

javascript - AngularJS ng-repeat 唯一的对象数组

javascript - ngOptions 按值比较

javascript - 计算整体重要性。 Angular 型

javascript - 我如何限制在 disqus 评论框中显示评论