SlideShare a Scribd company logo
Intro To Unit Testing
In AngularJS
Jim Lynch
Front-End Engineer
at Altered Image
twitter.com/webWhizJim
Slides available here: http://www.slideshare.net/
JimLynch22/intro-to-unit-testing-in-angularjs
Who is This Talk For?
• People interested in unit testing.
• AngularJS developers.
• Front-End developers.
Why Test?
• To prevent regression (recurring bugs).
• Catches bugs before end users see them.
• Removes fear from refactoring.
• Much quicker and less error-prone than manual testing.
• Can be a form of documentation for your code.
If You Don’t Test…
WRITE UNIT TESTS!!
Anatomy of a Test Suite
Anatomy of a Test Suite
Test Suite
Anatomy of a Test Suite
Test Case
Test Case
Test Suite
Anatomy of a Test Suite
Test Case
Assertion
Assertion
Assertion
Test Case
Test Suite
Anatomy of a Test Suite
Test Suite
• A collection of independent tests.
• Usually exists as its own file.
• Contains methods for setting
up for and tearing down unit
tests.
Test Case
Assertion
Assertion
Assertion
Test Case
Test Suite
Anatomy of a Test Suite
Test Case
• Tests a single “piece” of your
application independent of the
other code.
• A function that can either pass or
fail.
• Each case should test a
different “situation” from the
user’s perspective (BDD).
Test Case
Assertion
Assertion
Assertion
Test Case
Test Suite
Anatomy of a Test Suite
Test Case
Assertion
Assertion
Assertion
Test Case
Test Suite
Assertion
• Uses a matcher API for comparing
values 

eg. expected(var).toEqual(5)
• Tells the test case when it should
pass and when it should fail.
• If output values for SUT (system
under test) are as expected from
known input then behavior of SUT is
as expected.
Unit testing in JavaScript
uses a peculiar syntax…
If you are ever feeling lost,
just remember that a test
suite in JavaScript is this:
A describe
full of
it’s
with some
beforeEach’s
Test Suite Anatomy for JS

Testing Frameworks
it
describeTest Suite
Test Case
Assertion expect
it
expect
expect
Building Your First Test Suite
• A test suite is simply a Javascript file.
• Karma will automatically consider *.spec.js
files to be test suites.
Step 1) Create an empty *.spec.js file.
describe describe(‘MyController’, function() {
})
Building Your First Test Suite
Adding a describe.
describe describe(‘MyController’, function() {
})
A name for your test suite 

(can be anything, but it should
describe what you are testing!).
Building Your First Test Suite
Adding a describe.
describe describe(‘MyController’, function() {
})
A function that takes no
arguments. This creates the
“wrapper” around your test
cases.
Building Your First Test Suite
Adding a describe.
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an it.
describe
describe(‘MyController’, function() {
})
Some text that describes the
purpose of this test case. Can be
anything but usually begins with
the word should.
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an it.
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
A function that takes no
arguments. The code for this
test case is contained in this
function.
Adding an it.
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an assertion.
expect
expect(true).toEqual(true);
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an assertion.
expect
expect(true).toEqual(true);
The expect keyword lets the
test case know that we want to
do an assertion here.
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an assertion.
expect
expect(true).toEqual(true);
The expect method takes one
argument: the variable whose
value you wish to check.
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an assertion.
expect
expect(true).toEqual(true);
Depending on how you wish to
compare the two values, a
matcher method is chained
onto the end of the expect.
describe
describe(‘MyController’, function() {
})
it
Building Your First Test Suite
it(‘Should do something…’, function() {
});
Adding an assertion.
expect
expect(true).toEqual(true);
The matcher method takes one
argument: the expected value
for the variable being passed
into the expect method.
Building Your First Test Suite
You did it!
describe(‘MyController’, function() {
})
it(‘Should do something…’, function() {
});
expect(true).toEqual(true);
Ahhh, so a test suite is really just…
A describe
full of
it’s!
…with some beforeEach’s.
beforeEach
• Goes inside the describe
but outside of the it’s.
describe
it
expect
it
expect
beforeEach
beforeEach
• Gives you access to your
module, controllers,
services, etc. through DI.
beforeEach
describe(‘MyController’, function() {
})
it(‘Should do something…’, function() {
});
expect(true).toEqual(true);
beforeEach(module(‘YOUR_MODULE’));
beforeEach
beforeEach(module(‘YOUR_MODULE’));
Keyword that runs argument
before every it.
beforeEach
beforeEach(module(‘YOUR_MODULE’));
Allows you to load in
your module so that you have
access to it’s controllers,
services, filters, etc.
beforeEach
beforeEach(module(‘YOUR_MODULE’));
Replace this with the name
of your project’s module.
Injecting a Controller
with beforeEach
describe(‘MyController’, function() {
})
it(‘Should do something…’, function() {
});
expect(true).toEqual(true);
beforeEach(module(‘YOUR_MODULE’));
var myController = $controller('MyController', {})
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
Injecting a Controller
with beforeEach
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
A method from the angular-
mocks.js file that allows you to
inject services into your unit tests.
Injecting a Controller
with beforeEach
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
Angular knows to “unwrap”, the underscores,
find corresponding provider, and give you a
reference to the service.
Q. But what’s the deal with those
underscores on either side?
Injecting a Controller
with beforeEach
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
Angular knows to “unwrap”, the underscores,
find corresponding provider, and give you a
reference to the service.
Suppose you didn’t use the underscores. You want to set a variable named
$controller available inside of your “it’s” equal to the function’s argument, but
the function argument must be named $controller in order to be injected
properly. Doing this is not possible in JavaScript so the Angular team
implemented the underscore notation to work around the issue.
Injecting a Controller
with beforeEach
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
You can then use this global
reference anywhere in the test suite
to instantiate controllers.
Using the Injected
Controller
var myController = $controller('MyController', {})
This var has all of the properties
and methods you defined for the
specified controller.
Using the Injected
Controller
var myController = $controller('MyController', {})
This is the global $controller
variable that was set in the
beforeEach.
Using the Injected
Controller
var myController = $controller('MyController', {})
Replace this with the name
of the controller you want
to instantiate.
Pass in any arguments to your
controller with this object.
var myController = $controller('MyController', {})
Using the Injected
Controller
The Complete Suite
describe(‘MyController’, function() {
})
it(‘Should do something…’, function() {
});
expect(true).toEqual(true);
beforeEach(module(‘YOUR_MODULE’));
var myController = $controller('MyController', {})
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
A good start to a nice looking test suite:
Okay, so how do I run
these test suites?
Q )
KarmaA )
Fun Facts About Karma
• Created at Google- now open source.
• It’s a command line test runner.
• Integrates with practically all CI tools.
• Runs tests on all browsers (even PhantomJS).
How Does Karma Work?
• It integrates nicely with Gulp and Grunt (gulp test)
or runs on its own (karma start).
• It’s installed from npm: npm install karma
• The karma.conf.js file allows you to configure it to
run with your desired settings.
• It automatically sees *.spec.js files in your project
folder as test suites.
How do I add Karma to
My Project?
Easy Way Hard(er) Way
Use a yeoman generator to
scaffold a project that already
has karma set up for you
(such as the Gulp-Angular
generator).
Install and configure it
manually.
karma-runner.github.io
Adding Karma to Your Project
And then you’re ready to start testing!
All together now!
A JavaScript test suite is:
A describe
full of
it’s
with some
beforeEach’s
Thanks!
twitter.com/webWhizJim
jim@wisdomofjim.com
https://www.teepublic.com/t-shirt/468156-
describes-full-of-its-white-text
www.wisdomofjim.com
The official “Describe’s Full of
It’s” T-Shirt! Available now!
Slides available here: http://
www.slideshare.net/JimLynch22/intro-to-unit-
testing-in-angularjs

More Related Content

PDF
Test-Driven Development of AngularJS Applications
PDF
AngularJS Unit Testing w/Karma and Jasmine
PDF
Angular testing
PDF
Angularjs - Unit testing introduction
ODP
Unit Testing and Coverage for AngularJS
PPTX
Unit testing of java script and angularjs application using Karma Jasmine Fra...
PPT
Testing in AngularJS
PDF
AngularJS Unit Test
Test-Driven Development of AngularJS Applications
AngularJS Unit Testing w/Karma and Jasmine
Angular testing
Angularjs - Unit testing introduction
Unit Testing and Coverage for AngularJS
Unit testing of java script and angularjs application using Karma Jasmine Fra...
Testing in AngularJS
AngularJS Unit Test

What's hot (20)

PPTX
Unit testing in JavaScript with Jasmine and Karma
ODP
Angular JS Unit Testing - Overview
PDF
Advanced Jasmine - Front-End JavaScript Unit Testing
PPTX
AngularJS Unit Testing
PDF
Describe's Full of It's
PDF
Intro to testing Javascript with jasmine
ODP
Jquery- One slide completing all JQuery
PDF
JavaScript TDD with Jasmine and Karma
PDF
Jasmine BDD for Javascript
PDF
Quick tour to front end unit testing using jasmine
PPTX
Angular Unit Testing
PDF
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
PDF
Karma - JS Test Runner
PPTX
Unit testing JavaScript: Jasmine & karma intro
PPTX
Qunit Java script Un
PDF
Client side unit tests - using jasmine & karma
PDF
Painless JavaScript Testing with Jest
PDF
Angular Unit Testing NDC Minn 2018
PPTX
Angular Unit Testing
PDF
Angular Unit Testing from the Trenches
Unit testing in JavaScript with Jasmine and Karma
Angular JS Unit Testing - Overview
Advanced Jasmine - Front-End JavaScript Unit Testing
AngularJS Unit Testing
Describe's Full of It's
Intro to testing Javascript with jasmine
Jquery- One slide completing all JQuery
JavaScript TDD with Jasmine and Karma
Jasmine BDD for Javascript
Quick tour to front end unit testing using jasmine
Angular Unit Testing
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
Karma - JS Test Runner
Unit testing JavaScript: Jasmine & karma intro
Qunit Java script Un
Client side unit tests - using jasmine & karma
Painless JavaScript Testing with Jest
Angular Unit Testing NDC Minn 2018
Angular Unit Testing
Angular Unit Testing from the Trenches
Ad

Similar to Intro to Unit Testing in AngularJS (20)

PDF
JavaCro'14 - Unit testing in AngularJS – Slaven Tomac
PDF
Javascript tdd byandreapaciolla
PDF
Angularjs Test Driven Development (TDD)
PDF
How Testability Inspires AngularJS Design / Ran Mizrahi
PPTX
Slaven tomac unit testing in angular js
PDF
An Introduction To Testing In AngularJS Applications
PDF
Angular Intermediate
PDF
Automated testing for client-side - Adam Klein, 500 Tech
PDF
Testacular
PDF
Angular Application Testing
PDF
Unit Testing in Angular
PDF
Unit-testing and E2E testing in JS
PDF
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
PDF
Unit Testing Front End JavaScript
PDF
Testing: ¿what, how, why?
PDF
Unit Testing - The Whys, Whens and Hows
PPTX
Tests in Javascript using Jasmine and Testacular
PDF
We Are All Testers Now: The Testing Pyramid and Front-End Development
PDF
Front-end Testing (manual, automated, you name it) - Erich Jagomägis - Develo...
PDF
Testing in FrontEnd World by Nikita Galkin
JavaCro'14 - Unit testing in AngularJS – Slaven Tomac
Javascript tdd byandreapaciolla
Angularjs Test Driven Development (TDD)
How Testability Inspires AngularJS Design / Ran Mizrahi
Slaven tomac unit testing in angular js
An Introduction To Testing In AngularJS Applications
Angular Intermediate
Automated testing for client-side - Adam Klein, 500 Tech
Testacular
Angular Application Testing
Unit Testing in Angular
Unit-testing and E2E testing in JS
JAVASCRIPT TDD(Test driven Development) & Qunit Tutorial
Unit Testing Front End JavaScript
Testing: ¿what, how, why?
Unit Testing - The Whys, Whens and Hows
Tests in Javascript using Jasmine and Testacular
We Are All Testers Now: The Testing Pyramid and Front-End Development
Front-end Testing (manual, automated, you name it) - Erich Jagomägis - Develo...
Testing in FrontEnd World by Nikita Galkin
Ad

Recently uploaded (20)

PDF
How to Confidently Manage Project Budgets
PPTX
FLIGHT TICKET RESERVATION SYSTEM | FLIGHT BOOKING ENGINE API
PDF
AI in Product Development-omnex systems
PDF
Build Multi-agent using Agent Development Kit
PPTX
ISO 45001 Occupational Health and Safety Management System
PDF
System and Network Administration Chapter 2
PDF
Digital Strategies for Manufacturing Companies
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
PPTX
Presentation of Computer CLASS 2 .pptx
PDF
medical staffing services at VALiNTRY
PDF
A REACT POMODORO TIMER WEB APPLICATION.pdf
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
AIRLINE PRICE API | FLIGHT API COST |
PDF
The Role of Automation and AI in EHS Management for Data Centers.pdf
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
How to Confidently Manage Project Budgets
FLIGHT TICKET RESERVATION SYSTEM | FLIGHT BOOKING ENGINE API
AI in Product Development-omnex systems
Build Multi-agent using Agent Development Kit
ISO 45001 Occupational Health and Safety Management System
System and Network Administration Chapter 2
Digital Strategies for Manufacturing Companies
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
Presentation of Computer CLASS 2 .pptx
medical staffing services at VALiNTRY
A REACT POMODORO TIMER WEB APPLICATION.pdf
Odoo POS Development Services by CandidRoot Solutions
AIRLINE PRICE API | FLIGHT API COST |
The Role of Automation and AI in EHS Management for Data Centers.pdf
Which alternative to Crystal Reports is best for small or large businesses.pdf
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Softaken Excel to vCard Converter Software.pdf
How Creative Agencies Leverage Project Management Software.pdf
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...

Intro to Unit Testing in AngularJS

  • 1. Intro To Unit Testing In AngularJS
  • 2. Jim Lynch Front-End Engineer at Altered Image twitter.com/webWhizJim Slides available here: http://www.slideshare.net/ JimLynch22/intro-to-unit-testing-in-angularjs
  • 3. Who is This Talk For? • People interested in unit testing. • AngularJS developers. • Front-End developers.
  • 4. Why Test? • To prevent regression (recurring bugs). • Catches bugs before end users see them. • Removes fear from refactoring. • Much quicker and less error-prone than manual testing. • Can be a form of documentation for your code.
  • 5. If You Don’t Test… WRITE UNIT TESTS!!
  • 6. Anatomy of a Test Suite
  • 7. Anatomy of a Test Suite Test Suite
  • 8. Anatomy of a Test Suite Test Case Test Case Test Suite
  • 9. Anatomy of a Test Suite Test Case Assertion Assertion Assertion Test Case Test Suite
  • 10. Anatomy of a Test Suite Test Suite • A collection of independent tests. • Usually exists as its own file. • Contains methods for setting up for and tearing down unit tests. Test Case Assertion Assertion Assertion Test Case Test Suite
  • 11. Anatomy of a Test Suite Test Case • Tests a single “piece” of your application independent of the other code. • A function that can either pass or fail. • Each case should test a different “situation” from the user’s perspective (BDD). Test Case Assertion Assertion Assertion Test Case Test Suite
  • 12. Anatomy of a Test Suite Test Case Assertion Assertion Assertion Test Case Test Suite Assertion • Uses a matcher API for comparing values 
 eg. expected(var).toEqual(5) • Tells the test case when it should pass and when it should fail. • If output values for SUT (system under test) are as expected from known input then behavior of SUT is as expected.
  • 13. Unit testing in JavaScript uses a peculiar syntax…
  • 14. If you are ever feeling lost, just remember that a test suite in JavaScript is this:
  • 15. A describe full of it’s with some beforeEach’s
  • 16. Test Suite Anatomy for JS
 Testing Frameworks it describeTest Suite Test Case Assertion expect it expect expect
  • 17. Building Your First Test Suite • A test suite is simply a Javascript file. • Karma will automatically consider *.spec.js files to be test suites. Step 1) Create an empty *.spec.js file.
  • 18. describe describe(‘MyController’, function() { }) Building Your First Test Suite Adding a describe.
  • 19. describe describe(‘MyController’, function() { }) A name for your test suite 
 (can be anything, but it should describe what you are testing!). Building Your First Test Suite Adding a describe.
  • 20. describe describe(‘MyController’, function() { }) A function that takes no arguments. This creates the “wrapper” around your test cases. Building Your First Test Suite Adding a describe.
  • 21. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an it.
  • 22. describe describe(‘MyController’, function() { }) Some text that describes the purpose of this test case. Can be anything but usually begins with the word should. it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an it.
  • 23. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); A function that takes no arguments. The code for this test case is contained in this function. Adding an it.
  • 24. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an assertion. expect expect(true).toEqual(true);
  • 25. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an assertion. expect expect(true).toEqual(true); The expect keyword lets the test case know that we want to do an assertion here.
  • 26. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an assertion. expect expect(true).toEqual(true); The expect method takes one argument: the variable whose value you wish to check.
  • 27. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an assertion. expect expect(true).toEqual(true); Depending on how you wish to compare the two values, a matcher method is chained onto the end of the expect.
  • 28. describe describe(‘MyController’, function() { }) it Building Your First Test Suite it(‘Should do something…’, function() { }); Adding an assertion. expect expect(true).toEqual(true); The matcher method takes one argument: the expected value for the variable being passed into the expect method.
  • 29. Building Your First Test Suite You did it! describe(‘MyController’, function() { }) it(‘Should do something…’, function() { }); expect(true).toEqual(true); Ahhh, so a test suite is really just…
  • 30. A describe full of it’s! …with some beforeEach’s.
  • 31. beforeEach • Goes inside the describe but outside of the it’s. describe it expect it expect beforeEach beforeEach • Gives you access to your module, controllers, services, etc. through DI.
  • 32. beforeEach describe(‘MyController’, function() { }) it(‘Should do something…’, function() { }); expect(true).toEqual(true); beforeEach(module(‘YOUR_MODULE’));
  • 34. beforeEach beforeEach(module(‘YOUR_MODULE’)); Allows you to load in your module so that you have access to it’s controllers, services, filters, etc.
  • 36. Injecting a Controller with beforeEach describe(‘MyController’, function() { }) it(‘Should do something…’, function() { }); expect(true).toEqual(true); beforeEach(module(‘YOUR_MODULE’)); var myController = $controller('MyController', {}) beforeEach(inject(function(_$controller_) { $controller = _$controller_; }));
  • 37. Injecting a Controller with beforeEach beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); A method from the angular- mocks.js file that allows you to inject services into your unit tests.
  • 38. Injecting a Controller with beforeEach beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); Angular knows to “unwrap”, the underscores, find corresponding provider, and give you a reference to the service. Q. But what’s the deal with those underscores on either side?
  • 39. Injecting a Controller with beforeEach beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); Angular knows to “unwrap”, the underscores, find corresponding provider, and give you a reference to the service. Suppose you didn’t use the underscores. You want to set a variable named $controller available inside of your “it’s” equal to the function’s argument, but the function argument must be named $controller in order to be injected properly. Doing this is not possible in JavaScript so the Angular team implemented the underscore notation to work around the issue.
  • 40. Injecting a Controller with beforeEach beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); You can then use this global reference anywhere in the test suite to instantiate controllers.
  • 41. Using the Injected Controller var myController = $controller('MyController', {}) This var has all of the properties and methods you defined for the specified controller.
  • 42. Using the Injected Controller var myController = $controller('MyController', {}) This is the global $controller variable that was set in the beforeEach.
  • 43. Using the Injected Controller var myController = $controller('MyController', {}) Replace this with the name of the controller you want to instantiate.
  • 44. Pass in any arguments to your controller with this object. var myController = $controller('MyController', {}) Using the Injected Controller
  • 45. The Complete Suite describe(‘MyController’, function() { }) it(‘Should do something…’, function() { }); expect(true).toEqual(true); beforeEach(module(‘YOUR_MODULE’)); var myController = $controller('MyController', {}) beforeEach(inject(function(_$controller_) { $controller = _$controller_; })); A good start to a nice looking test suite:
  • 46. Okay, so how do I run these test suites? Q ) KarmaA )
  • 47. Fun Facts About Karma • Created at Google- now open source. • It’s a command line test runner. • Integrates with practically all CI tools. • Runs tests on all browsers (even PhantomJS).
  • 48. How Does Karma Work? • It integrates nicely with Gulp and Grunt (gulp test) or runs on its own (karma start). • It’s installed from npm: npm install karma • The karma.conf.js file allows you to configure it to run with your desired settings. • It automatically sees *.spec.js files in your project folder as test suites.
  • 49. How do I add Karma to My Project?
  • 50. Easy Way Hard(er) Way Use a yeoman generator to scaffold a project that already has karma set up for you (such as the Gulp-Angular generator). Install and configure it manually. karma-runner.github.io Adding Karma to Your Project And then you’re ready to start testing!
  • 51. All together now! A JavaScript test suite is:
  • 52. A describe full of it’s with some beforeEach’s
  • 53. Thanks! twitter.com/webWhizJim [email protected] https://www.teepublic.com/t-shirt/468156- describes-full-of-its-white-text www.wisdomofjim.com The official “Describe’s Full of It’s” T-Shirt! Available now! Slides available here: http:// www.slideshare.net/JimLynch22/intro-to-unit- testing-in-angularjs