Angularjs jasmine测试控制器从作用域函数调用服务
我有一个控制器,在$scope中公开了一个函数,它调用一个服务loginServiceAngularjs jasmine测试控制器从作用域函数调用服务,angularjs,testing,jasmine,Angularjs,Testing,Jasmine,我有一个控制器,在$scope中公开了一个函数,它调用一个服务loginService $scope.validateCredentials = function (callback){ loginService.validate($scope.username, $scope.password) .then(function (){ self.credentialsRight();
$scope.validateCredentials = function (callback){
loginService.validate($scope.username, $scope.password)
.then(function (){
self.credentialsRight();
if (typeof callback !== "undefined") {
callback("credentials right callback");
}
}, function (){
self.credentialsWrong();
if (typeof callback !== "undefined") {
callback("credentials wrong callback");
}
})
}
我已经设法测试了前面提到的方法是否正确,用茉莉花这样测试它
it("validateCredentials - passing in the right credentials", function() {
spyOn(loginService, 'validate').andCallFake(function() {
return successfulDeferred.promise;
});
$scope.validateCredentials(function() {
expect($scope.error).toBe(false);
});
$scope.$apply();
});
我之所以用间谍打电话和打电话给fake,是因为我想伪造一个被退回的承诺。请注意,我尝试使用$httpBackend.onPOST执行此操作,但未成功
然而,我觉得在我的控制器中使用回调仅用于测试目的和处理异步响应是很奇怪的。你们知道更好的方法吗?我看到了等待和运行,但似乎对我不起作用。这里是我在代码库中的一个类似测试。您需要适应您的解决方案。但基本上,您需要在调用服务方法后调用deferred.reject(someData)。然后您可能需要调用根作用域上的摘要。然后测试你的期望。用您的登录服务替换personApi
//setup the controller
var $scope, ctrl, deferred, personApi, rootScope, log,basePerson;
beforeEach(inject(function ($rootScope, $q, $controller, _personApi_) {
rootScope = $rootScope;
$scope = $rootScope.$new();
deferred = $q.defer();
personApi = _personApi_;
ctrl = $controller('personCtrl', {
$scope: $scope,
personApi: personApi
});
}));
it('should map returned errors to the original object', function () {
spyOn(personApi, 'save').and.callFake(function () {
return deferred.promise;
});
$scope.person = basePerson;
deferred.reject(stronglyNamedErrors);
$scope.savePerson();
$scope.$root.$digest();
expect($scope.person.firstNameError).toBe(stronglyNamedErrors.firstNameError);
});