角度资源承诺捕获,茉莉花toThrow()

acl*_*ve1 2 javascript jasmine angularjs karma-jasmine angular-mock

我在角度控制器中有一些代码:

user是一个angular $资源,在调用get方法时返回一个promise.

$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";
            });

};
Run Code Online (Sandbox Code Playgroud)

我正试图测试它是否抛出错误与茉莉如此:

expect(function(){
  scope.login();
}).toThrow();
Run Code Online (Sandbox Code Playgroud)

但是抛出了这个错误:

抛出异常的预期函数.

我已经测试了承诺的接受度,它按预期工作,但我假设有一些我无法处理的异步方面.

我也试过调用传入并调用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();
        });
Run Code Online (Sandbox Code Playgroud)

请注意,我的其他测试确实有效,我尝试了其他场景,其中服务器返回200和用户,一切正常.我专门测试$ scope.login()在收到服务器错误时是否抛出错误.

Tre*_*Dev 6

您需要设置$ httpBackend来模拟资源的响应.然后,您需要刷新这些结果,以便控制它们何时解决.

我在plunker上为你准备了一个简短的场景示例.

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

相关的spec文件. 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();
Run Code Online (Sandbox Code Playgroud)