angularjs - 使用 angularjs 测试 promise

标签 angularjs testing

我有这个工厂和她的测试:

angular.module('testApp')
  .factory('bar', function ($q) {
    // Service logic
    // ...

    var meaningOfLife = 42;

    // Public API here
    return {
      someMethod: function () {
        var deferred = $q.defer();

        setTimeout(function() {
          deferred.resolve();
        }, 1000);

        return deferred.promise;
      }
    };
  });


'use strict';

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

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

  it('should do something', function(done) {
    inject(function (bar) {
        var promise = bar.someMethod();
        promise.then(function(){
          expect(!!bar).toBe(true);
          done();
        });
      });
  });
});

测试返回这个:

在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调

我知道在工厂中用 $timeout 替换 setTimeout 并在测试中添加 $timeout.flush(),它有效。

但是,我想了解如何使用 setTimeout 而不是 $timeout 来进行此测试。

最佳答案

那是因为 setTimeout() 没有在 AngularJS 的摘要循环中运行。您应该使用 $timeout 而不是 setTimeout。此外,在这种情况下,使用 jasmine 的 done() 回调函数并不适合,因为您可以清除所有同步存储的排队延迟函数。

DEMO

angular.module('testApp', [])
  .factory('bar', function ($q, $timeout) {
    // Service logic
    // ...

    var meaningOfLife = 42;

    // Public API here
    return {
      someMethod: function () {
        var deferred = $q.defer();

        $timeout(function() {
          deferred.resolve();
        }, 1000);

        return deferred.promise;
      }
    };
  });


'use strict';

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

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

  it('should do something', function() {
    inject(function (bar, $timeout) {
        var promise = bar.someMethod();
        promise.then(function(){
          expect(!!bar).toBe(true);
        });
        // flush out queued deferred functions!
        $timeout.flush();
      });
  });
});

关于angularjs - 使用 angularjs 测试 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34017720/

相关文章:

testing - 衡量 QA 在敏捷环境中执行情况​​的良好指标

html - 导航栏标题按钮在中等尺寸的屏幕上变长

javascript - 使用 ng-change 选择导致所有选择字段自动更改

ruby-on-rails - capybara fill_in 编号字段

testing - 如果测试因某个阈值而失败,请重试 teamcity 构建

c# - 为什么 C# .NET WinForms 应用程序的控件在不同的机器上显示不同?黑盒测试方法

node.js - 在 'capture' 上获得的 Artillery.io 值在 'expect' 上不可用

angularjs - chai-as-promised 错误地通过了测试

angularjs - 离线 Firebase

angularjs - AngularJS-保存路线之间的数据