이 테스트 코드가 주어지면
it('can login', inject(function ($httpBackend,$rootScope) {
// Set up the mock http service responses
authRequestHandler = $httpBackend.when('POST', '/login')
.respond({success: true, user: {email: '[email protected]', roles: ['user']}});
var promise = dsAuth.authenticateUser('123', '123')
promise.then(function (success) {
console.log('Got login response');
expect(success).toBe(true);
expect(dsIdentity.isAuthenticated()).toBe(true);
console.log(dsIdentity.currentUser);
});
$rootScope.$digest(); //a solution found in on SO that doesn't work
}));
(인증 서비스에서 반환되는) 약속이 해결되지 않습니까? 이 문제를 어떻게 해결할 수 있습니까? .then () 함수의 코드는 호출되지 않습니다.
서비스 코드 :
(function(angular) {
angular.module('dsApp').factory('dsAuth',
['$http','$q',dsAuth]);
function dsAuth($http,$q) {
return {
authenticateUser: function(username,password) {
var dfd = $q.defer();
$http.post('/login', {username: username, password: password}).then(function (resp) {
console.log($resp);
if (resp.data.success) {
var user = new atUser();
angular.extend(user, resp.data.user);
atIdentity.currentUser = user;
dfd.resolve(true);
} else {
dfd.resolve(false);
}
});
return dfd.promise;
},
logoutUser: function() {
var dfd = $q.defer();
$http.post('/logout', {logout: true}).then(function () {
atIdentity.currentUser = undefined;
dfd.resolve();
});
return dfd.promise;
}
};
}
}) (this.angular);
Jasmine은 비동기 기대와 함께 작동하지 않습니다. 이에 대한 해결책은의 flush()
기능 을 사용하는 것입니다 httpBackend
.
it('can login', inject(function ($httpBackend,$rootScope) {
// Set up the mock http service responses
authRequestHandler = $httpBackend.when('POST', '/login')
.respond({success: true, user: {email: '[email protected]', roles: ['user']}});
var promise = dsAuth.authenticateUser('123', '123')
var success = false;
promise.then(function (result) {
console.log('Got login response');
success = result;
console.log(dsIdentity.currentUser);
});
$httpBackend.flush();
expect(success).toBe(true);
expect(dsIdentity.isAuthenticated()).toBe(true);
}));
나는 그것이 어디에서 왔는지 잘 모르겠지만, dsIdentity
당신 자신의 코드에서 그것을 알아낼 수 있다고 생각합니다. 패턴은 동일합니다. 클로저 외부에 변수를 생성 한 다음 클로저 내부에 값을 설정합니다. 는 flush()
화재에 대한 약속을하게됩니다 그리고 당신은 갈 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다