Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unit Testing JavaScript Applications
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
TypeScript入門 2026
recruitengineers
PRO
3
740
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
160
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.7k
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
240
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
560
Head First モブプログラミング / Head First Mobprogramming
takaking22
10
12k
도구에서 동료까지: 10년차 AI 스타트업의 AI 적응기
inureyes
PRO
1
270
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.5k
【GCC2026】大規模言語モデルを活用した内製検索サービスの社内展開や業務活用
bandainamcostudios
PRO
0
340
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
1
290
モノリス Rails でも日中に rails db:migrate を走らせたい! / Daytime rails db:migrate on Monolithic Rails!
euglena1215
4
650
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
1
520
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
390
Code Review Best Practice
trishagee
74
20k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
280
Building Adaptive Systems
keathley
44
3.2k
Being A Developer After 40
akosma
91
590k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
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