Slide 1

Slide 1 text

Yohei Munesada @Frontrend Conference Final 2015.02

Slide 2

Slide 2 text

About Me Yohei Munesada http://www.yoheim.net

Slide 3

Slide 3 text

Today’s LT Test × Service Worker (requires HTTP)

Slide 4

Slide 4 text

front-end Ajax on HTTP Architecture back-end PageJS jQuery Ajax

Slide 5

Slide 5 text

Traditional Test Methodology front-end PageJS jQuery Ajax back-end Local Proxy Local Files

Slide 6

Slide 6 text

Cool Test Methodology front-end PageJS jQuery Ajax back-end Service Worker ×

Slide 7

Slide 7 text

Technologies ✦Service Worker ✦Jasmine ✦Message Channel ✦Promise ✦Chrome ✦jQuery

Slide 8

Slide 8 text

Technologies ✦Service Worker ✦Jasmine ✦Message Channel ✦Promise ✦Chrome ✦jQuery

Slide 9

Slide 9 text

Service Worker ✦ a kind of Web Worker, proxies HTTP Requests. /* Register @main.js */ navigator.serviceWorker.register('./sw.js') /* Fetch Event @sw.js */ self.onfetch = function(event) { return event.respondWith(…); }

Slide 10

Slide 10 text

Message Channel ✦ messaging between a window and a worker. /* @main.js */ var messageChannel = new MessageChannel(); navigator.serviceWorker.controller .postMessage(‘hello’, [messageChannel.port1]); /* @sw.js */ self.onmessage = function (event) { console.log(event.data); // ‘hello’ }

Slide 11

Slide 11 text

files

Slide 12

Slide 12 text

✦ index.html ✦ jQuery.js ✦ main.js ✦ jasmine.css ✦ jasmine.js ✦ jasmine-html.js ✦ boot.js ✦ sw.js Files

Slide 13

Slide 13 text

✦ index.html ✦ jQuery.js ✦ main.js ✦ jasmine.css ✦ jasmine.js ✦ jasmine-html.js ✦ boot.js ✦ sw.js Files

Slide 14

Slide 14 text

test target @main.js

Slide 15

Slide 15 text

✦ get fullName through Promise Test Target function getFullName (id) { return new Promise(function (done, fail) { $.getJSON('/api/users/' + id).then(function (user) { done(user.firstName + ‘ ’ + user.lastName); }).fail(fail); }); }

Slide 16

Slide 16 text

test data @main.js

Slide 17

Slide 17 text

Test Data var testData = { '/api/users/1': { firstName: ‘Yohei', lastName: ‘Munesada’ }, '/api/users/2': {firstName: 'Tomoko', lastName: null}, '/api/users/3': {firstName: null, lastName: 'Yamada'}, '/api/users/4': {firstName: null, lastName: null} };

Slide 18

Slide 18 text

test @main.js

Slide 19

Slide 19 text

✦ Regist ServiceWorker, Set mock data BeforeEach - main.js beforeEach(function (done) { navigator.serviceWorker.register('./sw.js').then(function () { var mc = new MessageChannel(); mc.port2.onmessage =done; var str = JSON.stringify(testData); navigator.serviceWorker.controller .postMessage(str, [messageChannel.port1]); })catch(function () { done(false); }); });

Slide 20

Slide 20 text

Test - main.js it(‘test-001', function (done) { getFullName(1).then(function (fullName) { expect('Yohei Munesada').toBe(fullName); done(); }); });

Slide 21

Slide 21 text

✦ Unregist Service Worker AfterEach - main.js afterEach(function (done) { navigator.serviceWorker .getRegistration().then(function (reg) { reg.unregister().then(done); }); });

Slide 22

Slide 22 text

sw.js

Slide 23

Slide 23 text

✦ Receive message, Setup mock data, and Replay. Setup Mock Data - sw.js self.onmessage = function (event) { // Mockσʔλड͚औΓͱԠ౴ var mockObject = JSON.parse(event.data); if (event.ports) { event.ports[0].postMessage('Mock Data Recived'); } // Mockڍಈͷఆٛ self.onfetch = function(event) {…} };

Slide 24

Slide 24 text

✦ HTTP Jack onfetch - sw.js self.onfetch = function(event) { var path = (new URL(event.request.url)).pathname; // MockΛฦ٫͢Δ if (mockObject && mockObject[path]) { var response = _createResponse(path); return event.respondWith(response); // ϦΫΤετΛεϧʔ͢Δ } else { return; } };

Slide 25

Slide 25 text

✦ Create mock response createResponse - sw.js function _createResponse (path) { var mock = mockObject[path]; var body = JSON.stringify(mock); var head = { status: 200, statusText: 'OK', headers: { 'Content-Type': 'application/json' } }; return new Response(body, head); }

Slide 26

Slide 26 text

Demo

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Service Worker is Fantastic !

Slide 29

Slide 29 text

@yoheiMune http://www.yoheim.net ϒϩά΍5XJUUFSͰ͸ɺϑϩϯτΤϯυωλΛத৺ʹൃ৴͍ͯ͠·͢ɻ
 ؾʹͳͬͨͧͱ͍͏ํ͸ͥͻͱ΋ϑΥϩʔΛ͓ئ͍͠·͢?? Thank you