Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Unit Testing JavaScript Applications
Search
Stephen Thomas
February 09, 2014
Technology
3k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Unit Testing JavaScript Applications
Video of presentation at
http://www.infoq.com/presentations/tdd-javascript
Stephen Thomas
February 09, 2014
More Decks by Stephen Thomas
See All by Stephen Thomas
Sepsis
sathomas
0
110
Leave No One Behind
sathomas
0
130
Introducing D3.js
sathomas
0
2.5k
Building JavaScript Visualizations Part 1
sathomas
1
2.7k
Building JavaScript Visualizations Part 2
sathomas
0
2.6k
Securing JavaScript Web Applications
sathomas
4
430
Web-Based Visualizations with D3.js
sathomas
8
850
Custom Domains with Github Pages
sathomas
2
330
Other Decks in Technology
See All in Technology
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
1
290
PQC移行の今 -- IETF からみた現在地
satokan
4
660
顧客の成果創出とプロダクトの成長を 両立するためのFDE
sansantech
PRO
0
500
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
140
Databricksメトリクスビューはじめてのもくもく会
taka_aki
0
140
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
270
形式手法を使って仕様をコーディングしよう
mikanichinose
0
140
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
140
Incremental HTTP
kazuho
3
1.1k
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
310
AIに書かせて、プラットフォームで縛る ― EKSプラットフォームで実践した責任境界と権限設計
elmodev09
1
1.1k
Harness Engineering on Rails
joelq
0
760
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
890
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
450
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Scaling GitHub
holman
464
140k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Transcript
http://github.com/sathomas/jsunittest
[email protected]
icon-comment-alt icon-comments icon-comments-alt icon-credit-card icon-dashboard icon-download icon-download-alt icon-edit
icon-envelope icon-envelope-alt icon-leaf icon-legal icon-lemon icon-lock icon-unlock icon-magic icon-magnet icon-map-marker icon-minus icon-minus-sign icon-resize-vertica icon-retweet icon-road icon-rss icon-screenshot icon-search icon-share icon-share-alt icon-shopping-car http://speakerdeck.com/sathomas Directional Icons icon-arrow-down icon-arrow-left icon-arrow-right icon-arrow-up icon-chevron-down icon-circle-arrow-down icon-circle-arrow-left icon-circle-arrow-right icon-circle-arrow-up icon-chevron-left icon-car icon-car icon-car icon-car icon-ch Video Player Icons icon-play-circle icon-play icon-step-backward icon-fast-backward icon-fas icon-ste Unit Testing JavaScript Applications Stephen Thomas
Finding Bugs is a Bitch!
What If We Could “Childproof” Our Code?
Continuous Test Driven Development Block bugs from getting into our
code at all.
1. Frictionless testing during development 2. Re-use of tests for
integration 3. Coverage reports
1. Frictionless testing during development 2. Re-use of tests for
integration 3. Coverage reports Test’Em: Test Development Environment Mocha+: Command line execution Blanket.js: Coverage analysis
Example Application
1. Test Development Environment
Test’Em Configuration { "framework": "mocha", "src_files": [ "node_modules/jquery/dist/jquery.js", "node_modules/underscore/underscore.js", "node_modules/backbone/backbone.js",
"node_modules/chai/chai.js", "node_modules/sinon/pkg/sinon.js", "src/*.js", "test/*.js" ] }
Test Driven Development 1. Write a Test 2. Verify That
It Fails 3. Make It Pass 4. Repeat As Necessary
First Test describe("Application", function(){ it("creates global variable…", function(){ should.exist(todoApp); })
})
Passing Code if (typeof todoApp === "undefined") { todoApp =
{}; }
None
None
None
Testing a Model describe("Todo Model", function(){ describe("Initialization", function(){ beforeEach(function(){ this.todo
= new todoApp.Todo(); }) it("should default status…", function(){ this.todo.get('complete').should.be.false; }) it("should default title…", function(){ this.todo.get('title').should.equal(""); }) }) …
Make The Tests Pass todoApp.Todo = Backbone.Model.extend({ defaults: { title:
"", complete: false } })
Testing a View describe("Todo List Item View", function(){ beforeEach(function(){ this.todo
= new todoApp.Todo({ title: "Todo"}); this.item = new todoApp.TodoListItem({ model: this.todo}); }) it("render() should return view", function(){ this.item.render().should.equal(this.item); }); it("should render as list item", function(){ this.item.render() .el.nodeName.should.equal("LI"); })
Stubs describe("Todo Model", function(){ describe("Attributes", function(){ beforeEach(function(){ this.todo = new
todoApp.Todo(); this.stb = sinon.stub(this.todo,"save"); }) afterEach(function(){ this.stb.restore(); }) it(“should set title attr…", function(){ this.todo.set('title',"Test"); this.todo.get('title') .should.equal("Test"); })
Mocking a REST API describe("REST API", function(){ it("should load via
the API", function(){ this.ajax = sinon.stub($,"ajax") .yieldsTo("success", [ {id:1, title:"Mock1", complete:false} ]); this.todos = new todoApp.Todos(); this.todos.fetch(); this.todos.should.have.length(1); this.todos.at(0).get('title') .should.equal("Mock1"); this.ajax.restore(); }) })
Mocha Tip #1: Never “Comment Out” a Test describe("Todo Model",
function(){ describe("Initialization", function(){ beforeEach(function(){ this.todo = new todoApp.Todo(); }) it("should default…", function(){ this.todo.get('complete').should.be.false; })
Mocha Tip #1: Never “Comment Out” a Test describe("Todo Model",
function(){ describe("Initialization", function(){ beforeEach(function(){ this.todo = new todoApp.Todo(); }) it.skip("should default…", function(){ this.todo.get('complete').should.be.false; })
Mocha Tip #1: Never “Comment Out” a Test describe("Todo Model",
function(){ describe("Initialization", function(){ beforeEach(function(){ this.todo = new todoApp.Todo(); }) it.skip("should default…", function(){ this.todo.get('complete').should.be.false; })
None
Mocha Tip #1b: Skip an Entire Test Block describe.skip("Todo Model",
function(){ describe("Initialization", function(){ beforeEach(function(){ this.todo = new todoApp.Todo(); }) it("should default…", function(){ this.todo.get('complete').should.be.false; })
Mocha Tip #2: Focus on a Single Test describe("Todo Model",
function(){ describe("Initialization", function(){ beforeEach(function(){ this.todo = new todoApp.Todo(); }) it.only("should default…", function(){ this.todo.get('complete').should.be.false; })
2. Command-Line Test Execution
Test Code Setup if (typeof exports !== 'undefined' && this.exports
!== exports) { var jsdom = require("jsdom").jsdom; var doc=jsdom("<html><body></body></html>"); var window = doc.createWindow(); var $ = require("jquery")(window); global._ = require("underscore"); global.Backbone = require("backbone"); Backbone.$ = $; var chai = require("chai"); var sinon = require("sinon"); }
Mocha Options: mocha.opts test/app-todos-test.js src/app-todos.js
Run Mocha
3. Test Coverage
Install Blanket.js
Generate Coverage Report
None
None
Resources • Test Development Environment Test’em: https://github.com/airportyh/testem • Command Line
JavaScript Execution Environment node.js: http://nodejs.org • JavaScript Unit Testing Framework Mocha: http://visionmedia.github.io/mocha/ • JavaScript Assertion Library Chai: http://chaijs.com • Spies, Stubs, and Mocks Sinon.JS: http://sinonjs.org • Test Coverage Blanket.js: http://blanketjs.org