[英]angularjs jasmine promise testing
我正在嘗試測試我的登錄控制器,該控制器應將用戶的登錄名/密碼發送到服務,並說出服務中是否存在該用戶名。 這是我的代碼:
describe('LoginController', function() {
beforeEach(module('task6'));
var $controller, LoginService;
beforeEach(inject(function(_$controller_, _LoginService_) {
$controller = _$controller_;
LoginService = _LoginService_;
}));
describe('LoginController.submitLogin', function() {
it('tests if such user exists', function() {
var $scope = {};
var controller = $controller('LoginController',
{$scope: $scope});
controller.loginField = 'John';
controller.password = 'Smith';
LoginService.signIn(controller.loginField,
controller.password)
.then(function(logged) {
expect(true).toBe(false);
});
});
});
});
但是似乎“ .then”函數中的測試從未執行。 即使在這些條件下,它也可以通過所有測試。
這是因為您正在測試異步代碼,所以您需要使用以下方法使測試異步:
it('tests if such user exists', function(done) {
.....
LoginService.signIn(controller.loginField,
controller.password)
.then(function(logged) {
expect(true).toBe(false);
// done();
}).catch(function(failure) {
expect(true).toBe(true);
done();
})
});
});
完成使它等待承諾解決/拒絕。 如果它在2秒內沒有解決或拒絕(默認),則測試將失敗。
function signIn(username, password) {
/// THIS RETURNS A PROMISE BECAUSE $http returns a promise. Thus you can call THEN method on the return value because all promises have a THEN method.
return $http.post('myserver', {username:username, password:password});
}
// Another approach using $q
function signIn(username, password) {
var defer = $q.defer();
if (username==="fred" && password==="mypass") {
defer.resolve("nice one");
} else {
defer.reject("oh dear");
}
return defer.promise;
}
在這里,兩種方法都返回了希望。 所以現在,當我調用該函數時,可以在其返回值上調用THEN(因為返回值是一個承諾)...
signIn("fred", "badpass").then(function(response) {
console.log(response);
}).catch(function(failure) {
console.log(failure);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.