AngularJS单元测试条件响应

时间:2017-07-11 21:22:39

标签: angularjs jasmine

我正在使用带有karma / jasmine的angularjs进行测试。

如何使用3个条件if响应对successCallback进行单元测试?我在angularjs项目中有这个功能:

function loginCtrl($scope, $http, $log, $window) {
    $scope.error = '';
    $scope.submit = function () {
    $http({
        method: 'POST',
        url: '/login',
        headers: {'Content-Type': 'application/json'},
        data: {'username': $scope.username, 'password': $scope.userpassword},
    }).then(function successCallback(response, data) {
        if (response.data.successful) {
            //Success
            console.info('INFO: checkboxes.js::/login successful');
            $window.location.href = '/';                
        } else if (response.data.error) {
            //Error invalid credientials
            $scope.error = 'ERROR: ' + response.data.error;
            console.error('ERROR: checkboxes.js::/login error:', response.data.error);
        } else {
            //Error no creds sent. Empty body
            $scope.error = 'Invalid login: username and password combination'
            console.error('ERROR: checkboxes.js::/login invalid credentials')
        }
    }, function errorCallback(response) {
        $scope.error = 'An error occured, please try again later.'
        console.error('ERROR: checkboxes.js::/login', response.error)
    });
};
}

我尝试了下面的测试代码尝试点击第一个if块但没有成功。

    it('expects POST on /login success and reroutes to home page', function () {
        var response = {data:{successful:true}}
        var url = '/login',
            data = {
                'username': 'test.person', 
                'password': 'test'
            },
            header = {'Content-Type': 'application/json'},
            successCallback = jasmine.createSpy('success'),
            errorCallback = jasmine.createSpy('error');

        $httpBackend.expectPOST(url, data, header
        ).respond(200, response.data.successful)
        scope.submit();

        expect(successCallback).not.toHaveBeenCalled();
        $httpBackend.flush;
        expect(fakeWindow.location.href).toBe('/');
    }); 

1 个答案:

答案 0 :(得分:0)

我能够弄清楚这一点。我最终创建了一个工厂,它执行http post调用并将响应发送回该控制器。

然后,对于单元测试,我能够为每个条件响应创建一个测试。我只是嘲笑这项服务并让它发回不同的回复。