On Github tszewcow / it_survival_angular_lecture
Marek Matczak, Jarosław Fuczko, Tomasz Szewców
// define a module without dependencies
angular.module('moduleName', []);
// define a module with dependencies
angular.module('moduleName', ['dependency1', 'dependency2']);
// retrieve a module
angular.module('moduleName');
<!--Bootstrap application--> <div ng-app="moduleName"></div>
angular.module('moduleName').controller('SomeController', function($scope, someService){
'use strict';
// add something to injected $scope
$scope.data = {};
// call injected service method
someService.someMethod();
};
angular.module('someModule').controller('MyFirstController', function($scope){
'use strict';
$scope.helloWorld = 'hello world!';
alert($scope.helloWorld);
});
<!--use controller in the dialog template with the ng-controller directive -->
<!DOCTYPE html>
<html>
<body>
<section data-ng-controller="MyFirstController">
<h2>Hello from Dialog A!</h2>
</section>
</body>
</html>
angular.module('someModule').controller('MyFirstController', function($scope){
'use strict';
var cntl = this;
this.helloWorld = 'hello world!';
alert(this.helloWorld);
});
<!--use controller in the dialog template with the ng-controller directive -->
<!DOCTYPE html>
<html>
<body>
<section data-ng-controller="MyFirstController as cntl">
<h2>Hello from Dialog A!</h2>
<span>{{cntl.helloWorld}}</span>
</section>
</body>
</html>
angular.module('someModule').service('myService', function(){
'use strict';
this.print = function(){
alert('hello world from a service');
};
});
angular.module('someModule').factory('myService2', function(){
'use strict';
var helloWorld = 'hello world from a service2';
return {
print: function(){
alert(helloWorld);
}
};
});
<form name="myForm" novalidate="">
<input name="firstName" ng-model="user.firstName">
<input name="lastName" ng-model="user.lastName">
<input name="email" ng-model="user.email">
<button ng-click="submit()">Submit</button>
</form>
myForm: { //form name
fistName:{}, //input name
lastName:{}, //input name
email:{} //input name
}
myForm: { //form name
$dirty: false, $pristine: true, //dirty or pristine
$valid: false, $invalid: true, //valid or invalid
fistName: { //input name
$dirty: false, $pristine: true, //dirty or pristine
$valid: false, $invalid: true, //valid or invalid
$error: { //validation for field
required: true, //required validation
minlength: false //minlength validation
}
},
email: {} //input name
}
Branch with fallback solution when exercise 1 not done: step-2-first-controller
Branch with fallback solution when exercise 2 not done: step-3-forms
// Simple GET request example:
$http({
method: 'GET',
url: '/someUrl'
}).then(function successCallback(response) {
// this callback will be called asynchronously
// when the response is available
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
// shortcut methods
$http.get('/someUrl', config).then(successCallback, errorCallback);
$http.post('/someUrl', data, config).then(successCallback, errorCallback);
Branch with fallback solution when exercise 3 not done: step-4-edit-modal
Branch with fallback solution after exercise 4:
step-5-backend-communication
describe('A suite', function() {
it('contains spec with an expectation', function() {
expect(true).toBe(true);
});
});
// install Karma npm install karma
// install plugins npm install karma-jasmine npm install karma-phantomjs-launcher npm install karma-chrome-launcher
// run Karma ./node_modules/karma/bin/karma start / init / run // alternative npm install -g karma-cli karma start / init / run
// can be created with karma init command
module.exports = function (config) {
config.set({
basePath: '',
frameworks: [],
files: [],
hostname: 'localhost',
port: 9876,
autoWatch: false,
browsers: [],
singleRun: false,
})
};
// for debugging in a browser:
// - set single run to true
// - select other browser
http://karma-runner.github.io/0.8/config/configuration-file.html
describe('SampleCntl tests', function() {
'use strict';
var $scope;
beforeEach(module('someModule'));
beforeEach(inject(function($controller, $rootScope){
$scope = $rootScope.$new();
$controller('SampleCntl', {$scope: $scope});
}));
describe('some suite', function() {
it('some spec', function() {
// given
// when
$scope.someMethod();
// then
});
});
});
describe('SampleCntl tests', function() {
'use strict';
var cntl;
beforeEach(module('someModule'));
beforeEach(inject(function($controller){
cntl = $controller('SampleCntl', {});
}));
describe('some suite', function() {
it('some spec', function() {
// given
// when
cntl.someMethod();
// then
});
});
});
// sample controller code
angular.module('someModule').controller('SomeCntl', function($scope, $location){
'use strict';
$scope.goToDialog = function(path){
$location.path(path);
}
});
// test code
var $scope, locationMock = {
path: angular.noop
};
beforeEach(inject(function($controller, $rootScope){
$scope = $rootScope.$new();
// injection of mocked $location service
$controller('SomeCntl', {$scope: $scope, $location: locationMock});
}));
describe('data service tests', function () {
'use strict';
var someDataService;
beforeEach(module('app'));
beforeEach(inject(function (_someDataService_) {
someDataService = _someDataService_;
}));
describe('get data method', function () {
it('should return data', function () {
// given
var data = [];
// when
data = someDataService.getData();
// then
expect(data.length).toEqual(10);
});
});
});
// sample service code
angular.module('someModule').factory('serviceUnderTests', function('otherService'){
'use strict';
var data = [];
return {
getData: function(){
angular.copy(otherService.getData(), data);
},
getCurrent: function(){
return data;
}
};
});
// test code
var otherServiceMock = {getData: function(){return [1,2,3]}};
var serviceUnderTests;
beforeEach(function(){
module('someModule');
module(function($provide){
// injecting other service with $provide service
$provide.value('otherService', otherServiceMock);
);
});
beforeEach(function(_serviceUnderTests_){
serviceUnderTests = _serviceUnderTests_;
});
var booksData, $httpBackend;
beforeEach(inject(function (_booksData_, _$httpBackend_) {
booksData = _booksData_;
$httpBackend = _$httpBackend_;
}));
afterEach(function () {
// then
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should load books', function () {
// given
var searchParams = {title: 'title', author: 'author'}, books = [], response = [
{id: 0, title: 'title1'},
{id: 1, title: 'title2'}
];
$httpBackend.expectGET('/books-management/books-list/books.json?author=author&title=title').respond(response);
// when
booksData.getBooks(searchParams).then(function (response) {
books = response.data;
});
$httpBackend.flush();
// then
expect(books).toEqual(response);
});
Fallback branches for exercies 5 and 6:
step-6-testing-controller
step-7-testing-service