.then不是Angularjs工厂的一个功能

时间:2017-05-20 11:49:20

标签: jasmine

我刚刚开始学习angularjs的Jasmine测试用例。我无法测试下面的代码。亲自帮助

$scope.getConstants = function(lovName) {
    ConstantService.getConstants(lovName).then(function(d) {
        switch (lovName) {
        case 'WORKFLOW':
            $scope.workflowTypes = d;
            $scope.loadCounterpartyTmp();
            break;
            --------Other Cases
            }

我的ConstantService定义为

 App.factory('ConstantService', [ '$http', '$q', function($http, $q) {

return {
    getConstants : function(lovName) {
        return $http.post('/sdwt/data/getConstants/', lovName).then(function(response) {
            return response.data;
        }, function(errResponse) {
            return $q.reject(errResponse);
        });
    }

我想测试getConstants函数。我需要创建一个ConstantService模拟器并将数据传递给它。

我在下面写了测试用例,但是测试用例没有用。请让我知道如何测试上面的代码

  describe('getConstantsForMurexEntity', function() {
            it('testing getConstantsForMurexEntity function', function() {

   var d=[];
                d.push(
                    {id:1,value:'ABC'},
                    {id:2,value:'DEF'},
                    {id:3,value:'IJK'},
                    {id:4,value:'XYZ'},
                       );
                   //defined controller
                    spyOn(ConstantService, 'getConstants').and.returnValue(d);

                $scope.getConstants('WORKFLOW');
                expect($scope.workflowTypes).toBe(d);

上面的测试用例没有工作,因为它说" ConstantService.getConstants(...)。那么它不是一个函数"。

1 个答案:

答案 0 :(得分:1)

您的ConstantService.getConstants()函数会通过.then()调用返回您的实际代码正在使用的承诺。这意味着当你监视它时,你还需要返回一个你没有做的承诺。因为您没有返回承诺,当您的实际调用尝试调用.then()时,它是未定义的,这是错误消息的原因。

另外,您没有正确使用Array.push

您的测试应该类似于以下内容(注意,这是未经测试的):

describe('getConstantsForMurexEntity', function() {
  it('should set workflowTypes to the resolved value when lovName is "WORKFLOW"', inject(function($q) {
    var deferred = $q.defer();
    spyOn(ConstantService, 'getConstants').and.returnValue(deferred.promise);

    var d = [
      {id:1,value:'ABC'},
      {id:2,value:'DEF'},
      {id:3,value:'IJK'},
      {id:4,value:'XYZ'},
    ];

    $scope.getConstants('WORKFLOW');

    deferred.resolve(d);
    $scope.$apply();

    expect($scope.workflowTypes).toBe(d);
  }));
});