繁体   English   中英

在angularjs中对异步服务进行单元测试

[英]Unit testing an asynchronous service in angularjs

我正在尝试对具有异步方法但没有运气的服务进行单元测试。

我试图通过在angularjs中使用$ q支持来实现承诺。

任何帮助,将不胜感激。

http://jsfiddle.net/9pBze/37/

angular.module('myapp', ['myservice']);

angular.module('myservice', []).factory('myservice', function($q) {
  var ls = {};

  ls.DoIt = function() {
    var deferred = $q.defer();

    setTimeout(function(){
        deferred.resolve(5);
    },3000);

    return deferred.promise;
  }

  return ls;

});

describe('services', function () {

    beforeEach(module('myservice'));

    it("should equal 2",  inject(function(myservice) {
        myservice.DoIt().then(function(returned) {
            expect(returned).toEqual(2);
        });        
    }));
});

首先, setTimeout很难模拟,因此很难测试。 幸运的是,AngularJS周围有一个包装器( $timeout ),它具有相同的作用,但可以很容易地被嘲笑:

  ls.DoIt = function() {
    var deferred = $q.defer();

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

    return deferred.promise;
  }

$timeout提供的模拟使我们能够轻松地模拟经过的时间(使用$timeout.flush() ),这意味着我们的测试可以快速运行,而无需真正等待异步事件完成(请注意,生产代码仍在使用异步API!)。

更改后的测试如下所示:

it("should equal 5",  inject(function(myservice, $timeout) {

    var valueToVerify;
    myservice.DoIt().then(function(returned) {
      valueToVerify = returned;  
    });  
    $timeout.flush();        
    expect(valueToVerify).toEqual(5);
}));

最后是有效的jsFiddle: http : //jsfiddle.net/v9L9G/1/

它与Angular本身无关,但与Jasmine异步测试有关

如果需要setTimeout使用Angular $timeout 如果希望对setTimeout / $ timeout执行有很好的控制,请使用模拟Clock

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM