0

サービスから非同期関数を呼び出す関数のテストを作成しようとしています。私の人生の間、JasmineがAsync操作を実行する前に終了する方法を理解できません。 expect関数Jasmineが非同期関数が完了するのを待ちます。

describe('vm.submitLogin', function() { 
    var $scope; 
    var $q; 
    var deferred; 
    var $controller; 

    beforeEach(module('myModule')); 

    beforeEach(inject(function (_$controller_, _$rootScope_, _$q_, LoginService, $httpBackend) { 
     $q = _$q_; 
     $scope = _$rootScope_.$new(); 
     $controller = _$controller_; 
     deferred = _$q_.defer(); 

     spyOn(LoginService, 'login').and.callFake(function() { 
     return $.Deferred().resolve({success: true, twoFactorRequired: false}); 
     }); 

     $httpBackend.expectGET("/data/I/need/to/mock").respond({"uri": "http://localhost:8081/data/I/need/to/mock.json"}); 

     var vm = $controller('LoginCtrl', { $scope: $scope}); 

     vm.submitLogin(); 

     $scope.$apply(); 
    })); 

    it('should work, please work...', inject (function ($httpBackend, LoginService) { 

     expect(something); 

    })); 
    }); 

私はJasmineの "done"機能を使用しようとしましたが、実装方法についてはわかりません。この例では

、とすぐに呼ばれ

$scope.$apply(); 

として、それはすぐに期待にジャンプし、非同期操作が完了するまだ持っているので失敗します。

+1

まず、 'inject'ラッパーが同期していることです。もう一つはXY問題があるかもしれないということです。仕様が非同期でなければならないと思ったのは何でしたか?最初にAngular specで '$ .Deferred'は何をしますか? – estus

答えて

1

$スコープの前に$httpBackend.flush()を使用してみてください$(適用)角度のドキュメントでいう:。

を$ httpBackend生産に使用されるが、常に要求非同期 に応答します。ユニットテストでこの振る舞いをそのまま残しておけば、 は、書き込みが難しいasyncユニットテストを作成して、 に従って維持する必要があります。しかしどちらも、試験模擬試験が同期して に応答することはできない。これはテスト中のコードの実行を変更します。 このため、模擬$ httpBackendには、flush()メソッドがあります。 は、テストで明示的に保留中の要求をフラッシュできます。これにより、 のバックエンドの非同期APIが維持され、同時にテストに が実行されます。

関連する問題