如何在为Controller编写单元测试时限制调用服务依赖项?

时间:2016-04-13 08:07:15

标签: angularjs unit-testing

我有以下控制器:

(function () {

    "use strict";

    angular.module('usp.configuration').controller('ConfigurationController', ConfigurationController);

    ConfigurationController.$inject = ['$scope', '$rootScope', '$routeParams', 'configurationService'];


    function ConfigurationController($scope, $rootScope, $routeParams, configurationService) {

        //Get Master Gas List
        configurationService.getMasterGasList().then(function (response) {
            $scope.masterGasList = response.data.data;
        });

        $scope.convertToInt = function (str) {
            if (!isNumberEmpty(str) && !isNaN(str)) {
                return parseInt(str, 10);
            }
            return "";
        }

        $scope.convertToString = function (num) {
            if (!isNumberEmpty(num) && !isNaN(num)) {
                return num + "";
            }
            return "";
        }


    }

}());

以下是控制器的测试用例:

describe("test suite for Configuration test controller", function() {

    var scope = null;
    var configurationService;

    beforeEach(module("usp.configuration"));

    beforeEach(inject(function($rootScope, $controller, _configurationService_) {


         // Services
         // _'s are automatically unwrapped
        configurationService = _configurationService_;


        // Controller Setup
        scope = $rootScope.$new();
        $controller("ConfigurationController", {
            $scope: scope,
            configurationService : configurationService
        });
    }));

    it("should convert to int", function() {
        expect(scope.convertToInt("2")).toEqual(2);
    });

    it("should return empty string", function() {
        expect(scope.convertToInt("asd")).toEqual("");
    });
});

我在运行测试用例时不想调用该服务。

我是单元测试的新手,我不知道怎么能这样做。

请帮我这样做?

1 个答案:

答案 0 :(得分:1)

您需要使用$provide

模拟依赖项
beforeEach(function () {
   configurationServiceMock = {
      getSomething: function () {
        return 'mockReturnValue';
      }
   };

   module(function ($provide) {
      $provide.value('configurationService', configurationServiceMock);
   });
});

请参阅:Injecting a mock into an AngularJS service

满足您需求的解决方案:

var configurationServiceMock = {
   getMasterGasList: function () {
      return { 
         then: function(callback) {}
      };
   }
};

beforeEach(inject(function ($rootScope, $controller) {
   scope = $rootScope.$new();
   controller = $controller('ConfigurationController', {
     '$scope': scope,
     'configurationService': configurationServiceMock
   });
}));