2

角度コントローラーにいくつかのコードがあります:

user は、 get メソッドが呼び出されたときに promise を返す角度のある $resource です。

$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();

しかし、このエラーがスローされます:

例外をスローする関数が必要です。

期待どおりに機能する約束の受け入れをテストしましたが、対処できない非同期の側面があると想定しています。

また、passing 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 に答える