Unit testing an asynchronous service in angularjs

前端 未结 2 753
感情败类
感情败类 2020-12-05 15:18

I am trying to unit test a service which has asynchronous methods but am having no luck.

I have tried to implement with promises by using the $q support in angularjs

相关标签:
2条回答
  • 2020-12-05 15:31

    First of all, the setTimeout is particularly tricky to test since it hard to mock. Fortunately AngularJS has a wrapper around it ($timeout) that plays the same role but can be easily mocked:

      ls.DoIt = function() {
        var deferred = $q.defer();
    
        $timeout(function(){
            deferred.resolve(5);
        },3000);
    
        return deferred.promise;
      }
    

    The mock provided for $timeout allows us to easily simulate elapsed time (with $timeout.flush()) which means our tests can run fast, without really waiting for the async event to complete (please note that the production code is still using async API!).

    The changed tests would look like:

    it("should equal 5",  inject(function(myservice, $timeout) {
    
        var valueToVerify;
        myservice.DoIt().then(function(returned) {
          valueToVerify = returned;  
        });  
        $timeout.flush();        
        expect(valueToVerify).toEqual(5);
    }));
    

    And finally the working jsFiddle: http://jsfiddle.net/v9L9G/1/

    0 讨论(0)
  • 2020-12-05 15:31

    It's not related to Angular itself, but to Jasmine async tests.

    If you need a setTimeout use Angular $timeout. And if you wish to have a fine control over setTimeout/$timeout executions, use mocked Clock.

    0 讨论(0)
提交回复
热议问题