2013-11-03 134 views
2

我有以下控制器和服务,我试图在Jasmine中编写测试。我对此很新,只是想看看我是否采取了正确的方法来测试和嘲笑我的服务。在单元测试中模拟AngularJS服务的正确方法?

控制器

(function() { 
    'use strict'; 

    var app = angular.module('cs'); 

    app.controller('PlateCheckCtrl', ['$scope', 'PlateCheckService', function ($scope, PlateCheckService) { 
     var plateCheck = { 
      plateNumber: '', 
      message: '', 
      alertClass: '', 
      checkPlate: function (plateNumber) { 
       var _this = this; 

       PlateCheckService.checkPlate(plateNumber).then(function (response) { 
        _this.message = response.message; 
        _this.alertClass = response.alertClass; 
       }); 
      } 
     }; 

     $scope.plateCheck = plateCheck; 
    }]); 

}()); 

服务

(function() { 
    'use strict'; 

    var app = angular.module('cs'); 

    app.service('PlateCheckService', ['$http', function ($http) { 
     return { 
      checkPlate: function (plateNumber) { 
       return $http.post('PlateCheck/Index', { 
        plateNumber: plateNumber 
       }).then(function (response) { 
        return { 
         message: response.data.VehicleAtl === null ? 'Clean' : 'Hot', 
         alertClass: response.data.VehicleAtl === null ? 'alert-success' : 'alert-danger' 
        }; 
       }); 
      } 
     }; 
    }]); 

}()); 

控制器测试

describe('Spec Template', function() { 
    var scope, 
     controller; 

    beforeEach(function() { 
     module('cs'); 

     inject(function ($rootScope, $controller, $q) { 
      scope = $rootScope.$new(); 

      controller = $controller('PlateCheckCtrl', { 
       $scope: scope, PlateCheckService: { 
        checkPlate: function (plateNumber) { 
         var d = $q.defer(); 

         if (plateNumber === '123') { 
          d.resolve({ 
           message: 'Clean', 
           alertClass: 'alert-success' 
          }) 
         } else { 
          d.resolve({ 
           message: 'Hot', 
           alertClass: 'alert-danger' 
          }) 
         } 

         return d.promise; 
        } 
       } 
      }); 
     }); 
    }); 

    it('Should return "Clean" result', function() { 
     scope.plateCheck.checkPlate('123'); 
     scope.$apply(); 
     expect(scope.plateCheck.message).toBe('Clean'); 
     expect(scope.plateCheck.alertClass).toBe('alert-success'); 
    }); 

    it('Should return "Hot" result', function() { 
     scope.plateCheck.checkPlate('123456'); 
     scope.$apply(); 
     expect(scope.plateCheck.message).toBe('Hot'); 
     expect(scope.plateCheck.alertClass).toBe('alert-danger'); 
    }); 

}); 

服务测试

describe('Plate Check Service', function() { 
    var httpBackend, 
     service; 

    beforeEach(function() { 
     module('cs'); 

     inject(function ($httpBackend, PlateCheckService) { 
      httpBackend = $httpBackend; 
      httpBackend.whenPOST('PlateCheck/Index', { plateNumber: '123' }).respond({ VehicleAtl: null }); 
      httpBackend.whenPOST('PlateCheck/Index', { plateNumber: '123456' }).respond({ VehicleAtl: {} }); 
      service = PlateCheckService; 
     }); 
    }); 

    afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('Should send the request to the server', function() { 
     httpBackend.expectPOST('PlateCheck/Index', { plateNumber: '123' }); 
     service.checkPlate('123'); 
     httpBackend.flush(); 
    }); 

    it('Should return a "Clean" result', function() { 
     var result; 

     service.checkPlate('123').then(function (response) { 
      result = response; 
     }); 

     httpBackend.flush(); 

     expect(result.message).toBe('Clean'); 
     expect(result.alertClass).toBe('alert-success'); 
    }); 

    it('Should return a "Hot" result', function() { 
     var result; 

     service.checkPlate('123456').then(function (response) { 
      result = response; 
     }); 

     httpBackend.flush(); 

     expect(result.message).toBe('Hot'); 
     expect(result.alertClass).toBe('alert-danger'); 
    }); 
}); 
+1

对我来说这些简单的服务看起来不错。如果你需要模拟你的服务的依赖关系,你可以使用'$ provide.value',但在此之前,这正是我期望看到这些测试写的。 – Andyrooger

回答

1

你的控制器实际上本身并没有任何的功能只有服务做。所以你不应该在控制器中测试服务功能。

describe('Spec Template', function() { 
var scope, 
    controller, 
    PlateCheckServiceMock = { 
     checkPlate: function() {} 
    }; 


beforeEach(function() { 
    module('cs'); 

    inject(function ($rootScope, $controller, $q) { 
     scope = $rootScope.$new(); 
     spyOn(PlateCheckService, 'checkPlate').andCallThrough(); 
     controller = $controller('PlateCheckCtrl', { 
      $scope: scope, 
      PlateCheckService: PlateCheckServiceMock 
      } 
     }); 
    }); 
}); 
相关问题