Testing Angular 1.x controller's use of service with $httpBackend and Jasmine 2.x
Created for discussion
http://www.coderanch.com/t/662688/HTML-CSS-JavaScript/function-Unit-testing-angularjs
by Peer Reynders
HTML
<link rel="stylesheet" href="https://jasmine.github.io/2.4/lib/jasmine.css">
<script src="https://jasmine.github.io/2.4/lib/jasmine.js"></script>
<script src="https://jasmine.github.io/2.4/lib/jasmine-html.js"></script>
<script src="https://jasmine.github.io/2.4/lib/boot.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-mocks.js"></script>
JavaScript
//--- CODE ---
(function(angular){
/*
Contrived login service hitting a login page:
Success:
1. POST /login with application/x-www-form-urlencoded {name,password}
2. 302 Redirect to /index.html
3. 200 OK from /index.html
Failure:
2a. 401 Unauthorized
*/
loginServiceFactory1.$inject = ['$http','$httpParamSerializerJQLike'];
function loginServiceFactory1 ($http, $httpParamSerializerJQLike) {
// login function for login service instance
function login (name, password) {
var config;
// login function's "login successful" handler
function loginOk (response) {
var etag = response.headers('etag'),
data = response.data;
// Do something with the response ...
return {
loggedIn: true,
status: response.status
};
}
// login function's "login failed" handler
function loginFail (response) {
return {
loggedIn: false,
status: response.status
};
}
// login body
config = {
url: '/login',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
data: $httpParamSerializerJQLike({
name: name,
password: password
})
};
// 2xx -> loginOK; loginFail otherwise
return $http(config).then(loginOk, loginFail);
} // end login
return { login: login }; // return the loginService instance
} // end loginServiceFactory1
// Controller using the login service
DemoController.$inject = ['loginService'];
function DemoController(loginService) {
var vm;
// controller instance "login attempt complete" handler
function successCb(result){
if (result.loggedIn) {
vm.result = vm.name +
' successfully logged in (' + result.status + ')';
} else {
vm.result = 'Login failed (' + result.status...