サービスから非同期関数を呼び出す関数のテストを作成しようとしています。私の人生の間、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();
として、それはすぐに期待にジャンプし、非同期操作が完了するまだ持っているので失敗します。
まず、 'inject'ラッパーが同期していることです。もう一つはXY問題があるかもしれないということです。仕様が非同期でなければならないと思ったのは何でしたか?最初にAngular specで '$ .Deferred'は何をしますか? – estus