Slide 1

Slide 1 text

TDD with buster.js By ( ), 2014-01-14 Dominykas Blyžė @dymonaz

Slide 2

Slide 2 text

Why buster? Works for node and browser Built-in server for browser tests (no fixture HTML boilerplate) Built-in sinon.js Super flexible

Slide 3

Slide 3 text

Why not buster? 0.x Development is kind of slow (yet stable enough) AMD is tricky Super flexible

Slide 4

Slide 4 text

Alternatives Modern: intern, karma, mocha Old Battle-tested: QUnit, jasmine, JsTestDriver See: https://github.com/theintern/intern#comparison

Slide 5

Slide 5 text

Getting started n p m i n s t a l l b u s t e r

Slide 6

Slide 6 text

Sample b u s t e r . j s https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/buster.js

Slide 7

Slide 7 text

Sample h e l p e r s . j s https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/buster.helpers.js

Slide 8

Slide 8 text

Run tests 1. . / n o d e _ m o d u l e s / . b i n / b u s t e r - s e r v e r 2. Point browser to localhost:1111 3. . / n o d e _ m o d u l e s / . b i n / b u s t e r - t e s t Or install globally, but that's a bad idea 1. r e q u i r e ( ' b u s t e r - n o d e ' ) 2. n o d e m y T e s t s . j s 0. n p m i n s t a l l g r u n t - b u s t e r n p m i n s t a l l - g g r u n t - c l i b r e w i n s t a l l p h a n t o m j s 1. g r u n t b u s t e r

Slide 9

Slide 9 text

Debugging c o n s o l e . l o g ( ) Browser: Chrome Dev Tools, Firebug, whatever node.js: WebStorm/PhpStorm/IntelliJ, n o d e - i n s p e c t o r

Slide 10

Slide 10 text

Demo time! Let's build a test result viewer Worth mentioning: b r o w s e r i f y : client side r e q u i r e ( ) g r u n t - c o n t r i b - w a t c h - autorun tasks n o d e m o n - autorestart server Disclaimer: do a better job for production!

Slide 11

Slide 11 text

i n i t ( e l ) should render status div should render results div when status is clicked: display results hide results onchange of textarea should loadResults()

Slide 12

Slide 12 text

should render status div https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/01‑render‑status.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/01‑render‑status.js

Slide 13

Slide 13 text

should render results div https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/02‑render‑results.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/02‑render‑results.js

Slide 14

Slide 14 text

when status is clicked, display results https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/03‑click‑display.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/03‑click‑display.js

Slide 15

Slide 15 text

when status is clicked, hide resultss https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/04‑click‑hide.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/04‑click‑hide.js

Slide 16

Slide 16 text

F5!

Slide 17

Slide 17 text

Test doubles Use for: isolation, forcing a code path, avoiding external calls, forcing errors sinon.spy: wraps around a method and records calls sinon.stub: replaces a method sinon.mock: replaces methods, built-in expectations

Slide 18

Slide 18 text

onchange of textarea should loadResults() https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/05‑click‑load.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/05‑click‑load.js

Slide 19

Slide 19 text

l o a d R e s u l t s ( ) should change status to loading should XHR should onReceived() after XHR

Slide 20

Slide 20 text

should XHR, then onReceived https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/06‑make‑xhr.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/06‑make‑xhr.js

Slide 21

Slide 21 text

should XHR, then onReceived (error) https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/07‑make‑xhr‑server.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/07‑make‑xhr‑server.js

Slide 22

Slide 22 text

should XHR, then onReceived (async) https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/08‑make‑xhr‑async.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/08‑make‑xhr‑async.js

Slide 23

Slide 23 text

should XHR, then onReceived (promise) https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/09‑make‑xhr‑promise.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/09‑make‑xhr‑promise.js

Slide 24

Slide 24 text

o n R e s u l t s R e c e i v e d ( ) when OK, should change status and add results when failed, should change status and add results when http error, should retry

Slide 25

Slide 25 text

Deferred tests https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/10‑when‑ok.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/10‑when‑ok.js

Slide 26

Slide 26 text

Focus rocket https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/11‑when‑failed.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/11‑when‑failed.js

Slide 27

Slide 27 text

Should retry in 100ms https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/12‑should‑retry.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/12‑should‑retry.js

Slide 28

Slide 28 text

F5!

Slide 29

Slide 29 text

Server side: / r e s u l t s should serve combined results.html should 404 when no browser results should 404 when no node results

Slide 30

Slide 30 text

should serve combined results.html https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/13‑should‑serve.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/13‑should‑serve.js

Slide 31

Slide 31 text

should 404 when no browser results https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/14‑when‑no‑browser.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/14‑when‑no‑browser.js

Slide 32

Slide 32 text

should 404 when no node results https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/15‑when‑no‑node.test.js https://github.com/dymonaz/javascript‑latvia‑20140114‑ tdd/blob/master/walkthrough/15‑when‑no‑node.js

Slide 33

Slide 33 text

Slides: http://dominykas.net/20 Code: http://dominykas.net/21 @dymonaz ;