2

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

user 是一个角度 $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();

但是会抛出这个错误:

预期函数抛出异常。

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

我也尝试过调用 pass in 并调用 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() 在收到服务器错误时是否抛出错误。

4

1 回答 1

6

你需要设置你的 $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();
于 2014-06-09T05:30:28.543 回答