如何在指令函数内部对http请求进行单元测试

时间:2015-09-28 11:32:25

标签: angularjs unit-testing directive

我在http请求中创建了一个函数,用于获取然后发布请求如何在这里测试该方法是我的指令控制器函数:

var getConfig = function () {
    if (!$scope.json) {
        $http.get('/schools/' + $scope.school.id + '/config?deployment_uuid=' + $scope.schoolId)
                .then(function (response) {
                    $scope.school.config = JSON.stringify(response.data, null, 4);
                });
    }
};

$scope.disable = function () {
    getConfig();
    $http.post('/school/' + $scope.school.id + '/update', {
        deployment_id: $scope.schoolId,
        component: $scope.schoolName,
        is_enabled: false,
        config: JSON.parse($scope.school.config)
    });
};

测试用例:

  describe('controller', function () {
        fit('should POST payload  for a scenario to disable', function () {
            $scope.school.config = JSON.stringify(mockSchoolConfig, null, 4);
            $scope.disable();
            $scope.$digest();
            $httpBackend.expect('POST', '/school/' + $scope.school.id + '/update', {
                deployment_id: $scope.schoolId,
                component: $scope.schoolName,
                is_enabled: false,
                config: $scope.school.config
            }).respond(200);
            //$httpBackend.flush();
        });
    });

Error: Unexpected request: GET /s/create-alarm/config?school_uuid=170bf60e-0153-4615-9a4e-a6bc3ad546ea

不再需要预期

如何测试此功能和http请求?

1 个答案:

答案 0 :(得分:1)

在您的代码中,您需要混合设置,请求和处理代码。虽然编写这样的代码很方便,但是很难测试(正如你所注意到的)。解决方案是将代码分成几部分,可能每部分都分成不同的函数:

var requestConfig() {
    return $http.get('/schools/' + $scope.school.id + '/config?deployment_uuid=' + $scope.schoolId);
}

var saveConfig(response) {
    $scope.school.config = JSON.stringify(response.data, null, 4);
}

var getConfig = function () {
    if (!$scope.json) {
        requestConfig()
                .then(function (response) {
                    saveConfig();
                });
    }
};

在测试中,您现在可以模拟这些功能。例如,您可以使用仅返回对象而不发出请求的函数替换requestConfig()

您可能还希望避免使用像$scope这样的全局变量,而是通过函数参数传递信息,以便更轻松地编写测试。