【问题标题】:How to write a test unit for a service that returns a promise如何为返回承诺的服务编写测试单元
【发布时间】:2015-07-05 00:26:06
【问题描述】:

这是我的 app.js 中的工厂

  app.factory('userInfoFacrory', ['$http' , "$q", function($http,$q){
    return {
           getNames:function(){
            var differed  = $q.defer();
            $http.get("http://localhost/ang/api/v1/users/names")
            .success(function(data) {
                differed.resolve(data);
            }).error(function(msg) {
                differed.reject(msg);
            });
            return differed.promise;
          }
    }
  }])

我在我的控制器中使用这个工厂,如下所示,它工作正常:

 app.controller('mainController', ['$scope','userInfoFacrory','$log', function($scope,userInfoFacrory,$log){

    var promise = userInfoFacrory.getNames();
    promise.then(function (data) {
        $log.info(data); // I get my data correctly here
    }, function (msg) {
        $log.error(data);
    })
}])

在这里,我尝试使用 karma-jasmine 编写一个测试单元

describe('userInfoFacrory', function() {
var  factory ,$rootScope,$scope,$q,onTaskComplete , promise;

       beforeEach(function() {
        module("testApp");
        inject(function ($injector) {   
            $q = $injector.get("$q");
            factory = $injector.get("userInfoFacrory");
            $rootScope = $injector.get("$rootScope");
            $scope = $rootScope.$new();
            promise = factory.getNames(); // this function comes from my factory which returns a promise 
        });      
      });

      it('should return a promise', function() {
          // This test will pass , so no error so far 
         expect(typeof promise.then).toEqual('function');
      });
});

但我不知道如何测试,所以如果我的诺言是否有我的数据(来自我的 api),任何建议都将不胜感激。

谢谢

【问题讨论】:

    标签: angularjs unit-testing promise karma-jasmine deferred


    【解决方案1】:
    it('should return a promise resolved with the http response data if the http request is successful', inject(function($httpBackend) {
    
        var expectedData = 'fake data';
        $httpBackend.expectGET('http://localhost/ang/api/v1/users/names').respond(expectedData);
        var promise = factory.getNames();
        var actualData;
        promise.then(function(result) {
            actualData = result;
        });
        $httpBackend.flush();
        expect(actualData).toEqual(expectedData);
    }));
    
    it('should return a promise rejected with the http response data if the http request is in error', inject(function($httpBackend) {
    
        var expectedData = 'fake data';
        $httpBackend.expectGET('http://localhost/ang/api/v1/users/names').respond(400, expectedData);
        var promise = factory.getNames();
        var actualData;
        promise.catch(function(result) {
            actualData = result;
        });
        $httpBackend.flush();
        expect(actualData).toEqual(expectedData);
    }));
    

    工作小伙伴:http://plnkr.co/edit/NfO6KXWLs1QT5HG8MK0J?p=preview

    请注意,您的代码是正确的,但并未真正利用 Promise 的链接功能。它可以简单地写成

    getNames: function() {
        return $http.get("http://localhost/ang/api/v1/users/names")
            .then(function(response) {
                return response.data;
            }, function(response) {
                return $q.reject(response.data);
            });
        };
    }
    

    工作小伙伴:http://plnkr.co/edit/C5x8wRYCQ0wetjozEd0a?p=preview

    【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 2014-07-05
    • 2016-10-04
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多