обещание ресурса angular, жасмин toThrow()

У меня есть код в угловом контроллере:

user — это angular $resource, который возвращает обещание при вызове метода get.

$scope.credentials = {
        username:"",
        password:"",
        rememberMe:false
    };

var currentUser  = {};

$scope.login = function(callback){
        user.get($scope.credentials)
            .$promise
            .then(function(user){
                $scope.currentUser = user;
                return cb ? cb(user) : user;
            })
            .catch(function(res){
                throw "LoginError";
            });

};

Я пытаюсь проверить, выдает ли он ошибку или нет с жасмином, например:

expect(function(){
  scope.login();
}).toThrow();

Но вылетает эта ошибка:

Ожидается, что функция вызовет исключение.

Я проверил принятие обещания, которое работает, как и ожидалось, но я предполагаю, что есть какой-то асинхронный аспект, с которым я не могу справиться.

Я также пытался вызвать передачу и вызов done(), но это тоже не сработало.

редактировать:

Я издеваюсь над своим бэкэндом так:

beforeEach(inject(function($rootScope,$controller,_$httpBackend_){



            $httpBackend = _$httpBackend_;
            successCallback = jasmine.createSpy();
            errorCallback = jasmine.createSpy();


            scope = $rootScope.$new();
            controller = $controller('LoginController',{
                '$scope':scope
            });

        }));

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

Обратите внимание, что другие мои тесты работают, я пробовал другие сценарии, когда сервер возвращает 200 и пользователь, и все работает. Я специально проверяю, выдает ли $scope.login() ошибку при получении ошибки сервера.


person aclave1    schedule 09.06.2014    source источник


Ответы (1)


Вам нужно настроить $httpBackend, чтобы имитировать ответ вашего ресурса. Затем вам нужно сбросить эти результаты, чтобы вы могли контролировать, когда они разрешатся.

Я собрал для вас краткий пример вашего сценария на plunker.

http://plnkr.co/edit/lnWaS1lyJja56Zh1STyl?p=preview

Соответствующий файл спецификации. http://embed.plnkr.co/lnWaS1lyJja56Zh1STyl/appSpec.js

Фрагмент с первого взгляда:

$httpBackend.expectGET('/api/index.php/user')
                .respond(500, 'error');
//Initiate request by calling your api/resource
$httpBackend.flush();
person TrevDev    schedule 09.06.2014