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

时间:2014-06-09 04:42:24

标签: javascript angularjs jasmine 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";
            });

};

我试图测试它是否会像茉莉一样抛出错误:

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()在收到服务器错误时是否抛出错误。

1 个答案:

答案 0 :(得分: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();