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
第9回SenchaUG@札幌「Siestaで中の人に頑張ってもらう」
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Tanaka Yuuya
June 10, 2013
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
第9回SenchaUG@札幌「Siestaで中の人に頑張ってもらう」
Tanaka Yuuya
June 10, 2013
More Decks by Tanaka Yuuya
See All by Tanaka Yuuya
Sencha いろはの「い」
tnker
0
860
第9回SenchaUG@札幌「Senchaが創造するRIA開発プラットフォームとサービス」
tnker
1
140
第9回SenchaUG@札幌「Sencha Learning Place No.2」
tnker
0
150
第8回SenchaUG@東京
tnker
0
150
第3回SenchaUG@東京
tnker
0
150
第2回SenchaUG@東京
tnker
1
220
第1回SenchaUG@東京
tnker
0
430
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Ruling the World: When Life Gets Gamed
codingconduct
0
260
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Bash Introduction
62gerente
615
220k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
How to Talk to Developers About Accessibility
jct
2
260
How GitHub (no longer) Works
holman
316
150k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
Into the Great Unknown - MozCon
thekraken
41
2.6k
The Curious Case for Waylosing
cassininazir
1
400
Transcript
SiestaΛͬͯɺதͷਓʹؤுͬͯΒ͓͏ גࣜձࣾθϊϑΟ খఅ Ұ߂
SiestaͬͯԿʁ w +4ΦϒδΣΫτͷൺֱ w %0.্ͷΤϨϝϯτͷଘࡏ֬ೝ w ϑΥʔϜͳͲͷೖྗςετ w υϥοάυϩοϓͳͲͷϢʔβૢ࡞ w
ͦͷଞFUD ؆୯ʹઆ໌͢Δͱɺ+4্ͷίʔυ͕ਖ਼ৗʹ ಈ࡞͍ͯ͠Δ͔Ͳ͏͔ΛࣗಈͰςετͯ͠ ͘ΕΔπʔϧͰ͢ɻ βοΫϦઆ໌͢ΔͱɺҎԼͷΑ͏ͳ͜ͱ͕ ग़དྷ·͢ɻ
ʮඦฉҰݟʹ͔ͣ͠ʯͰ͢
ࠓճ ࠓճ4FODIB&YU+4ͱɺ͜ͷͱͬͯૉఢͳ4JFTUBΛͬͯ؆୯ ͳΞϓϦέʔγϣϯΛ࡞Γɺ࣮ࡍʹͦͷΞϓϦέʔγϣϯͷࣗಈςετΛ͢ ΔҝͷςετέʔεΛ࡞͍͖ͬͯ·͢
αϯϓϧΞϓϦέʔγϣϯ
ࠓճ͏ΞϓϦέʔγϣϯ ͔ͤͬ͘ͳͷͰɺ4FODIB$NEΛͬ ͯΞϓϦέʔγϣϯΛ࡞͍͖ͬͯ·͠ΐ ͏ɻ 4FODIB$NEͰϓϩδΣΫτΛ࡞͢ ΔલͷσΟϨΫτϦߏ࣍ͷ௨Γɻ TELσΟϨΫτϦɺ&YU+4ͷ4%,͕ ೖ͍ͬͯΔσΟϨΫτϦʹͳΓ·͢ɻ
ࠓճ͏ΞϓϦέʔγϣϯ ४උ͕ग़དྷͨΒɺΈΜͳେ͖ࠇ͍ը໘ ʢλʔϛφϧʣ͔ΒίϚϯυͰϓϩδΣ ΫτΛੜ͠·͢ $ cd {project root dir} $
ls sdk/ $ sencha -sdk ./sdk/ generate app \ Siesta ./siesta [enter] Sencha Cmd v3.x.xxxx [INF] xxxx . . . $ ls sdk/ siesta/ w 4%,σΟϨΫτϦ w ໊લۭؒ w ੜ͢ΔϓϩδΣΫτσΟϨΫτϦ ࣍ͷΑ͏ʹ Λࢦఆͯ͋͛͠Δ͜ͱʹΑΓɺεέϧτ ϯͷΞϓϦέʔγϣϯ͕ੜ͞Ε·͢ɻ
ࠓճ͏ΞϓϦέʔγϣϯ ࠓճ༻͢ΔαϯϓϧΞϓϦέʔγϣ ϯɺӈͷΑ͏ͳͷΛ༻͠·͢ɻ ߏͱͯ͠ w ೖྗϑΥʔϜʢ&YUGPSN1BOFMʣ w σʔλΛදࣔ͢Δ(SJEʢ&YUHSJE1BOFMʣ ʹͳΓ·͢ɻ
ࠓճ͏ΞϓϦέʔγϣϯ ࣮ࡍɺ'PSNʹೖྗͨ͠Λ(SJEʹ Ճ͢ΔͷͰ͕͢ɺࠓճςετέʔ εΛಈ͔͢ҝʹ༻͢ΔͷͰɺ(SJE ͷՃͳͲͷॲཧೖΕͯ͋Γ·ͤ Μɻ อଘϘλϯΛԡͨ͠ࡍɺ୯७ʹอଘ ࣌ͷΠϕϯτ͕ൃՐ͢Δ͚ͩʹͳͬͯ ͍·͢ɻ
4JFTUBͷ४උ
·ͣɺμϯϩʔυ 4JFTUBΛ͏ʹɺΛμϯϩ ʔυ͢Δඞཁ͕͋Γ·͢ɻ ʢࠓճແྉ൛Λ͍͖ͬͯ·͢ʣ ແྉ൛ͷμϯϩʔυɺฐࣾϖ ʔδʹϦϯΫ͕ுͬͯ͋ΔͷͰɺͦͪ Β͔Βμϯϩʔυ͠·͢ɻ http://www.xenophy.com/product/ bryntum/siesta
ઃஔ͢Δ μϯϩʔυͯ͠ղౚͨ͠ΒɺσΟϨ ΫτϦ໊ΛʮTJFTUBʯͳͲʹϦωʔ Ϝͯ͠ɺΞϓϦέʔγϣϯͷϧʔτσ ΟϨΫτϦʹઃஔ͠·͢ɻ
ςετը໘ͷ४උ ςετͷىͱͳΔϖʔδͷ४උΛ͢ ΔҝʹɺUFTU@IBSOFTTIUNMΛ࡞ ͠·͢ɻ
ςετը໘ͷ४උ த͜Μͳײ͡Ͱɺදࣔʹඞཁͳ$44ͱ4JFTUBͷಈ࡞ʹඞཁͳ+4ͷಡΈ ࠐΈΛߦ͍ɺ࠷ޙʹςετέʔεͰ͋ΔUFTU@IBSOFTTKTΛಡΈࠐΈ·͢ <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css"
href="./resources/default/app.css"/> <link rel="stylesheet" type="text/css" href="./siesta/resources/css/siesta-all.css"> <script type="text/javascript" src="./ext/ext-all.js"></script> <script type="text/javascript" src="./siesta/siesta-all.js"></script> <script type="text/javascript" src="./test_harness.js"></script> </head> <body> </body> </html>
ςετը໘ͷ४උ ଓ͍ͯɺઌ΄Ͳͷ)5.-ͰಡΈࠐ· ͍ͤͯͨɺςετέʔεͷىͱͳΔ UFTU@IBSOFTTKTΛ࡞͠·͢ɻ
ςετը໘ͷ४උ ͪ͜Βͷதɺ4JFTUBͷॳظ ઃఆͱɺ͜Ε͔Β֎෦ϑΝΠϧͰ هड़͢Δ֤ςετέʔεͷఆٛΛ ߦ͍·͢ɻ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({
title: 'Siesta Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] });
ςετը໘ͷ४උ ςετͷ࣮ߦʹ༻͍ΔΠϯελϯ εͷऔಘ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta
Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] });
ςετը໘ͷ४උ ଓ͍ͯɺ4JFTUBຊମͷઃఆΛߦ ͍͖ͬͯ·͢ɻ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta
Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] }); w UJUMF ςετը໘ͷλΠτϧ w MPBEFS1BUI ΞϓϦέʔγϣϯͷ໊લۭؒͷղܾ ʢ&YU-PBEFSͱಉ༷ͷઃఆʣ
ςετը໘ͷ४උ ଓ͍ͯɺQSFMPBEͷઃఆ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta Test',
loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] }); w QSFMPBE ֤ςετͰඞཁʹͳΔ+4ϑΝΠϧ܈
ςετը໘ͷ४උ ֎෦ϑΝΠϧʹఆ͍ٛͯ͠Δɺ֤ ςετέʔεͷಡΈࠐΈઃఆ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta
Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sample.t.js' ] }); w HSPVQ JUFNTʹఆ͍ٛͯ͠Δ֤ςετέ ʔεͷάϧʔϓ໊ w JUFNT ֎෦ϑΝΠϧʹఆ͍ٛͯ͠Δςετ έʔε܈
ςετը໘ͷ४උ ࠷ޙʹɺ࣮ࡍͷςετέʔεೖΕ͓ͯ ͘UFTUTσΟϨΫτϦΛ࡞͠ɺ·ͣ w UFTUT@TBNQMFUKT Λ࡞͍͖ͯ͠·͢ɻ
ςετը໘ͷ४උ @TBNQMFUKTͷίʔυ ࣍ͷΑ͏ͳܗʹͳΓ·͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS is
here’); t.requireOk(‘Siesta.controller.Main’); });
ςετը໘ͷ४උ ςετίʔυݪଇ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS is here’);
t.requireOk(‘Siesta.controller.Main’); }); StartTest(function(t) { ... }); Ͱϥοϓͯ͠هड़͍͖ͯ͠·͢ɻ
ςετը໘ͷ४උ 4UBSU5FTUʹ͞ΕΔҾͷU ɺ4JFTUB5FTUͷΠϯελϯε Ͱ͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS
is here’); t.requireOk(‘Siesta.controller.Main’); }); ͜ͷ4JFTUB5FTUΠϯελϯε ͍͔ͭ͘ͷΞαʔγϣϯϝιου ͕༻ҙ͞Ε͓ͯΓɺͦΕΒΛ༻ ͯ͠ςετίʔυΛهड़͍͖ͯ͠ ·͢ɻ
ςετը໘ͷ४උ EJBHϝιουɺςετέʔε Λ࣮ߦͨ͠ࡍͷɺ݁Ռදࣔ෦ʹ λΠτϧͷΑ͏ͳܗͰจࣈྻΛද ࣔͤ͞ΔҝͷϝιουͰ͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext,
‘ExtJS is here’); t.requireOk(‘Siesta.controller.Main’); });
ςετը໘ͷ४උ PLϝιουɺୈҾʹ༩͑ͨ ͕USVFͷ߹ςετΛύε ͠ɺୈҾʹ༩͑ͨจࣈྻΛς ετ݁Ռʹग़ྗ͠·͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext,
‘ExtJS is here’); t.requireOk(‘Siesta.controller.Main’); }); ӈͷίʔυͷ߹ɺ&YUΦϒδΣ Ϋτ͕ଘࡏ͢ΕςετΛύε͠ ·͢ɻ
ςετը໘ͷ४උ SFRVJSF0LϝιουɺͦͷΫϥ ε͕ਖ਼ৗʹSFRVJSF͞ΕΕςε τΛύε͠·͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS
is here’); t.requireOk(‘Siesta.controller.Main’); }); ·ͨɺ͜ͷޙ৮Ε͍͖ͯ·͕͢ɺ ୈҾʹίʔϧόοΫؔΛη οτ͢Δ͜ͱͰɺΫϥεΛϩʔυ ޙॲཧΛ࣮ߦ͢Δ͜ͱग़དྷ·͢
ςετը໘ͷ४උ ͜ͷଞʹ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS is here’);
t.requireOk(‘Siesta.controller.Main’); }); w EPOFϝιου w JTϝιου ͍͔ͭ͘ͷϝιου͕༻ҙ͞Εͯ ͍·͕͢ɺ͜͜Ͱ·ͣӈͷίʔ υΛ࣮ߦͯ͠Έ·͠ΐ͏ɻ
4JFTUBΛಈ͔ͯ͠ΈΔ
ઃஔͨ͠63-ʹΞΫηε ४උͷࡍʹ࡞ͨ͠ɺ UFTU@IBSOFTTIUNMʹΞΫηε͢ Δ͜ͱͰɺ4JFTUBͷςετը໘Λ։ ͘͜ͱ͕ग़དྷ·͢ɻ IUUQ\QSPKFDU3PPU%JS^UFTU@IBSOFTTIUNM
4JFTUB࣮ߦը໘ ΞΫηε͢ΔͱӈͷΑ͏ͳը໘͕։͖ ·͢ɻࠨͷπϦʔϏϡʔʹදࣔ͞Εͯ ͍Δͷ͕ɺ४උͷࡍʹ࡞ͨ͠ɺ UFTU@IBSOFTTKTʹهड़ͨ͠ɺςε τέʔεҰཡͰ͢ɻ
4JFTUB࣮ߦը໘ ςετΛ࣮ߦ͢ΔʹɺπϦʔϏϡʔ ʹදࣔ͞Ε͍ͯΔςετέʔεΛμϒ ϧΫϦοΫ͢Δ͜ͱͰ࣮ߦͰ͖·͢ɻ
4JFTUB࣮ߦը໘ ςετΛ࣮ߦ͢Δͱɺઌ΄Ͳهड़ͨ͠ ςετέʔε͕ΓӈͷΑ͏ͳ߲͕ ग़ྗ͞Ε·͢ɻ
4JFTUB࣮ߦը໘ t.diag(‘Hello World!!’);
4JFTUB࣮ߦը໘ t.ok(Ext, ‘ExtJS is here’);
4JFTUB࣮ߦը໘ t.requireOk('Siesta.controller.Main');
4JFTUB࣮ߦը໘ ͜Ε͕؆୯ͳςετͷํ๏ʹͳΓ· ͢ɻͦΕͰɺ಄Ͱ৮Εͨαϯϓϧ ΞϓϦέʔγϣϯΛݩʹɺ·ͣσʔ λ.PEFMͷςετέʔεΛॻ͍ͯΈ ·͠ΐ͏ɻ
.PEFMͷςετέʔεΛॻ͍ͯΈΔ
ςετέʔεͷՃ UFTU@IBSOFTTKTʹ৽ͨʹ߲ ΛՃ͠·͢ɻ ... Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js'
] }, { group: ‘Model’, items: [ ‘tests/021_product.t.js’ ] });
.PEFMͷςετέʔε ϞσϧͷςετέʔεԼهͷΑ͏ʹɺSFRVJSF0Lϝιουͷίʔϧόο ΫͰνΣοΫΛߦͬͨΓग़དྷ·͢ɻ ͜͜Ͱɺɹ1SPEVDUϞσϧΛಡΈࠐΈσʔλΛੜɺͦͷσʔλ͕ੜͰ ͖͍ͯΔ͔ΛJTϝιουͰνΣοΫ͍ͯ͠·͢ɻ StartTest(function(t) { t.requireOk('Siesta.model.Product', function() {
var model = Ext.create('Siesta.model.Product', { id: 10, name: 'Siesta Test Model' }); t.is(model.get('id'), 10, 'Create Siesta Test Model!!'); }); });
4UPSFͷςετέʔε ·ͨɺࠓճߦ͍·ͤΜ͕4UPSFͷςετέʔεΛॻ͘ࡍɺ CFHJO"TZOD͓ΑͼFOE"TZODΛར༻ͯ͠ɺ4UPSFͷಡΈࠐΈ͕ྃ͢ Δ·Ͱɺςετͷ࣮ߦΛࢭΊ͓ͯ͘ඞཁ͕͋Γ·͢ɻ StartTest(function(t) { t.requireOk('Siesta.store.Products', function() { var
store = Ext.create('Siesta.store.Products'), sync = t.beginAsync(); store.load({ callback: function() { // check code here... t.endAsync(sync); } }); });
ଓ͍ͯ7JFXͷςετέʔεͰ͢
ςετέʔεͷՃ UFTU@IBSOFTTKTʹ7JFX༻ ͷɺςετέʔεΛՃ͠·͢ɻ ... Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js'
] }, { group: ‘Model’, items: [ ‘tests/021_product.t.js’ ] }, { group: ‘View’, items: [ ‘tests/031_grid.t.js’ ] });
7JFXͷςετέʔε 7JFXͷςετέʔεΛߦ͏ͨΊʹʢࠓճ(SJEͷέʔεʣ w දࣔʹඞཁͳΫϥεͷSFRVJSFνΣοΫ w දࣔʹඞཁͳΠϯελϯεͷੜʢࠓճ(SJEͳͷͰ4UPSF͕ඞཁʣ 4UPSFੜ࣌ʹTUPSF*EϓϩύςΟΛઃఆ͢Δඞཁ༗ w 7JFXͷੜ
SFOEFS5PϓϩύςΟͰඳըઌΛ&YUHFU#PEZ ʹઃఆ w ্هྃޙʹ֤ςετॲཧΛهड़ ίʔυ͕গ͘͠ͳΔͷͰɺ࣍ͷεϥΠυʹࡌͤ·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); });
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEΛදࣔ͢ΔͷʹඞཁͳΫϥεͷSFRVJSFν ΣοΫΛߦ͍·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEʹදࣔ͢ΔͨΊͷ4UPSFΛੜ͠·͢ɻ ͜ͷࡍʹɺ(SJEʹఆٛͨ͠4UPSF*%ͷઃఆΛ ߦΘͳ͍ͱ(SJEʹσʔλ͕දࣔͰ͖ͳ͍ͷͰ ҙ͍ͯͩ͘͠͞ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEͦͷͷΛੜ͠·͢ɻ ඳըઌΛɺ&YUHFU#PEZϝιουͰઃఆ͠· ͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEͷ͕දࣔ͞ΕΔ·Ͱػ͢ΔϝιουͰ ͢ɻ͜ΕΛར༻ͯ͠ɺ(SJEͷ༰͕දࣔ͞Ε ͔ͯΒςετΛߦ͍·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); ͜͜Ͱߦ͍ͬͯΔͷɺ4UPSFͷσʔλ ͱɺ(SJEʹ࣮ࡍදࣔ͞Ε͍ͯΔσʔλ͕ಉ ͔͡Ͳ͏͔ΛνΣοΫ͍ͯ͠·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); ˞͜͜ޙͰॻ͘
͓͔ͪͶͷϢʔβೖྗγϛϡϨʔτ
function() { function() { function() { function() { // ...
} } } } Ϣʔβૢ࡞γϛϡϨʔτͷྲྀΕ 4JFTUBͰߦ͑ΔϢʔβૢ࡞ͷ γϛϡϨʔτɺ 4JFTUB5FTU4JNVMBUFԼͷ ϝιουɺ 4JFTUB5FTU"DUJPOΫϥε͕ ৭ʑͱߦͬͯ͘Ε·͢ɻ ಈ࡞ͷྲྀΕͱͯ͠ɺ֤ΞΫγ ϣϯྃޙʹίʔϧόοΫΛݺ ͼग़͢ͱ͍͏ඇಉظͳܗʹͳΓ ·͢ɻ ਂ͘ͳͬͯ·͏ŋŋŋ
ͦΜͳ͋ͳͨʹ DIBJOϝιουͱ͍͏ͷ͕༻ҙ͞Ε ͍ͯ·͢ɻ͜ΕɺDIBJOͷҾʹॱ ࣮࣍ߦ͍ͨؔ͠Λ͠ɺͦͷؔͷ தͰςετΛߦ͏ࡍʹɺҾʹೖͬͯ ͘ΔΠϯελϯεΛςετϝιουʹ ͯ͋͛͠·͢ɻ ͜ͷΑ͏ʹɺॱ൪ʹؔΛͯ͋͛͠ Δ͚ͩͰɺ؆୯ʹॱ࣮࣍ߦ͢Δ͜ͱ͕ Ͱ͖·͢ʂ
t.chain( function (next) { t.type(userNameField, 'username', next) }, function (next) { t.type(passwordField, 'secret', next) }, function (next) { t.click(loginButton, next) }, function () { // done } });
ͦΜͳ͋ͳͨʹ ·ͨɺ͜ͷDIBJOϝιου"DUJPO ͱݺΕΔΦϒδΣΫτΛͯ͋͛͠ Δ͜ͱͰɺςετέʔεΛ࡞Δ͜ͱ ͕ग़དྷ·͢ɻ t.chain({ action : 'type', target
: userNameField, text : 'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton });
ͦΜͳ͋ͳͨʹ ࢦఆͰ͖Δ༰ͱͯ͠ t.chain({ action : 'type', target : userNameField, text
: 'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton }); w BDUJPO ࣮ߦ͢ΔΞΫγϣϯ໊ʢDMJDLʣ w UBSHFU ΞΫγϣϯͷରͱͳΔΤϨϝϯτ ʢ࣍ͷεϥΠυͰ͏গ͠ৄ͘͠ʣ w UFYU BDUJPOUZQFͷ߹ɺςΩετϑΟʔϧ υʹೖྗ͢Δจࣈྻɺ͜ͷଞʹBDUJPO ຖʹࢦఆͰ͖ΔΦϓγϣϯ͋Γ·͢ ͕ɺৄ͘͠"1*υΩϡϝϯτΛ͝ཡ͘ ͍ͩ͞ɻ
UBSHFUʹ͍ͭͯ 4JFTUBͰɺ͍Ζ͍Ζͳํ๏ͰΞΫγ ϣϯͷରͱͳΔΤϨϝϯτΛࢦఆͰ ͖ΔΑ͏ʹͳ͍ͬͯ·͢ɻ t.chain({ action : 'type', target :
userNameField, text : 'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton }); w BDUJPO ࣮ߦ͢ΔΞΫγϣϯ໊ʢDMJDLʣ w UBSHFU ΞΫγϣϯͷରͱͳΔΤϨϝϯτ ʢ࣍ͷεϥΠυͰ͏গ͠ৄ͘͠ʣ w UFYU BDUJPOUZQFͷ߹ɺςΩετϑΟʔϧ υʹೖྗ͢Δจࣈྻɺ͜ͷଞʹBDUJPO ຖʹࢦఆͰ͖ΔΦϓγϣϯ͋Γ·͢
UBSHFUʹ͍ͭͯ t.chain({ action : 'type', target : userNameField, text :
'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton }); w 4JFTUB5FTU#SPXTFS )5.-ΤϨϝϯτ <Y Z>ܗࣜͷྻͰ࠲ඪࢦఆ %0.ΫΤϦʔΛද͢$44ηϨΫλ w &YU+4͓Αͼ5PVDI &YUEPN&MFNFOUͷΠϯελϯε &YU$PNQPOFOUͷΠϯελϯε ίϯϙδοτΫΤϦʔจࣈྻ ίϯϙʔωϯτΫΤϦʔจࣈྻ ʢ͜ΕͰࢦఆ͢Δ߹ɺઌ಄ʹ ʠʡΛ͚ͭΔඞཁ͕͋Γ·͢ʣ
Ϣʔβૢ࡞ΛγϛϡϨʔτ͢Δςετίʔυ 4JFTUBͰߦ͑ΔϢʔβૢ࡞ͷγϛϡϨʔτɺ4JFTUB5FTU4JNVMBUF Լͷϝιουɺ4JFTUB5FTU"DUJPOΫϥε͕৭ʑͱߦͬͯ͘Ε·͢ɻ શମΛࡌͤΔͱ͘ͳͬͯ͠·͏ͷͰɺϙΠϯτຖʹઆ໌͍͖ͯ͠·͢ɻ ࠓճͷϢʔβૢ࡞Ͱߦ͍ͷҎԼ w ͭͷUFYUpFMEʹΛೖྗͤ͞Δ w ೖྗͨ͠Λอଘ͢ΔͨΊʹɺอଘϘλϯΛΫϦοΫͤ͞Δ w
อଘϘλϯ͕ΫϦοΫ͞ΕͨࡍͷΠϕϯτΛर͍ɺೖྗͨ͠ͷνΣοΫΛߦ͏
γϛϡϨʔτ ·ͣɺඞཁͳΫϥεͷಡΈࠐΈ͓ Αͼੜ͕ྃͨ͠ΒɺGPSNί ϯϙʔωϯτͷɺςετέʔε ʹ͏ཁૉΛલͬͯऔಘ͓ͯ͠ ͖·͢ɻ ... Ext.create('Siesta.store.Products', { storeId:
'Products' }); form = Ext.create('Siesta.view.Form', { width: 500, renderTo: Ext.getBody() }); nameFld = form.down('textfield[name=name]'); idFld = form.down('textfield[name=id]'); saveButton = form.down('button[text=อଘ]'); ...
γϛϡϨʔτ ͜ͷ෦Ͱ͢Ͷɻ ੜͨ͠GPSN͔ΒEPXOϝιου Λར༻ͯ͠ɺͦΕͧΕͷίϯϙʔ ωϯτΛऔಘ͓͖ͯ͠·͢ɻ ... Ext.create('Siesta.store.Products', { storeId: 'Products'
}); form = Ext.create('Siesta.view.Form', { width: 500, renderTo: Ext.getBody() }); nameFld = form.down('textfield[name=name]'); idFld = form.down('textfield[name=id]'); saveButton = form.down('button[text=อଘ]'); ...
γϛϡϨʔτ ଓ͍ͯɺอଘϘλϯΛΫϦοΫ͞ ΕͨࡍͷςετॲཧΛॻ͍͓͖ͯ ·͢ɻ ... nameFld = form.down('textfield[name=name]'); idFld =
form.down('textfield[name=id]'); saveButton = form.down('button[text=保存]'); form.on('saveCommand', function(form) { var values = form.getValues(); t.diag('保存ボタンがクリックされました'); t.is(values.name, nameValue, 'nameフィールド の⼀一致'); t.is(values.id, idValue, 'idフィールドの⼀一致'); t.endAsync(sync); }); form.loadRecord(rec); ...
γϛϡϨʔτ POϝιουΛར༻ͯ͠ɺGPSN͕ ൃՐ͍ͯ͠Δɺอଘ࣌ͷ TBWF$PNNBOEΠϕϯτΛϦ οεϯ͠·͢ɻ ͦͯ͠ɺͦͷதͰߦ͍ͬͯΔͷ GPSNʹೖྗ͞Ε͕ͨ߹͍ͬͯ Δ͔Ͳ͏͔ͷνΣοΫͰ͢ɻ ... nameFld
= form.down('textfield[name=name]'); idFld = form.down('textfield[name=id]'); saveButton = form.down('button[text=保存]'); form.on('saveCommand', function(form) { var values = form.getValues(); t.diag('保存ボタンがクリックされました'); t.is(values.name, nameValue, 'nameフィールド の⼀一致'); t.is(values.id, idValue, 'idフィールドの⼀一致'); t.endAsync(sync); }); form.loadRecord(rec); ...
γϛϡϨʔτ GPSNʹରͯ͠ɺ࠷ॳʹ࡞͓ͬͯ ͍ۭͨͷ.PEFMΛϩʔυͤͯ͞ ͓͖·͢ɻ ... nameFld = form.down('textfield[name=name]'); idFld =
form.down('textfield[name=id]'); saveButton = form.down('button[text=保存]'); form.on('saveCommand', function(form) { var values = form.getValues(); t.diag('保存ボタンがクリックされました'); t.is(values.name, nameValue, 'nameフィールド の⼀一致'); t.is(values.id, idValue, 'idフィールドの⼀一致'); t.endAsync(sync); }); form.loadRecord(rec); ...
γϛϡϨʔτ ͦͯ͠ɺ࠷ޙʹ֤ΞΫγϣϯΛఆ ͍͖ٛͯ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ·ͣ࠷ॳɺ*%ͷUFYUpFMEʹ Λೖྗ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ࣍ʹɺ໊લͷUFYUpFMEʹΛೖ ྗ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ͦͯ͠ɺ࠷ޙʹ֤ΞΫγϣϯΛఆ ͍͖ٛͯ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ࠷ޙʹɺอଘϘλϯΛΫϦοΫ͞ ͤΔΞΫγϣϯΛೖΕͨΒςετ έʔεͰ͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target:
idFld, text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
ݟͯΈΑ͏ʂ
4JFTUBΛར༻ͨ͠4FODIB5PVDIͷςετέʔε
ςετը໘ͷ४උ ४උ͢ΔϑΝΠϧʹ͍ͭͯɺ &YU+4ͱԿΒมΘΓͳ͍ͷͰ w UFTU@IBSOFTTIUNM w UFTU@IBSOFTTKT ্هͭͷۭϑΝΠϧΛઌʹՃͯ͠ ͓͖·͠ΐ͏ɻ
αϯϓϧΞϓϦέʔγϣϯ ͜͜Ͱςετʹ༻͢ΔΞϓϦέʔγ ϣϯɺ4FODIB5PVDIͰॳظϓϩδ ΣΫτΛ࡞ͨ͠ࡍʹੜ͞ΕΔΞϓ ϦέʔγϣϯΛɺςετ༻ͷαϯϓϧ ΞϓϦέʔγϣϯͱͯ͠ར༻͠·͢ɻ
ςετը໘ͷ४උ UFTU@IBSOFTTIUNMͷத΄ͱΜͲมΘΓ·ͤΜɺಡΈࠐΉϦιʔε͕ 4FODIB5PVDI༻ͷͷʹͳ͙ͬͨΒ͍Ͱ͢Ͷɻ <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css"
href="./touch/resources/css/sencha-touch.css"/> <link rel="stylesheet" type="text/css" href="./siesta/resources/css/siesta-touch-all.css"> <script type="text/javascript" src="./touch/sencha-touch-all.js"></script> <script type="text/javascript" src="./siesta/siesta-touch-all.js"></script> <script type="text/javascript" src="./test_harness.js"></script> </head> <body> </body> </html>
ςετը໘ͷ४උ ࣍ɺUFTU@IBSOFTTKTͷதΛ ॻ͍͍͖ͯ·͢ɻ ߏ&YU+4ͱಉ͡Ͱɺͪ͜Β Ϧιʔε͕มΘ͙ͬͨΒ͍Ͱ ͢ɻ var Harness = Siesta.Harness.Browser.SenchaTouch;
Harness.configure({ title: 'Siesta Test', loaderPath: { 'Siesta': 'app' }, preload: [ './touch/resources/css/sencha-touch.css', './touch/sencha-touch-all-debug.js' ] }); Harness.start({ group: 'View', items: [ 'tests/010_tabview.t.js' ] });
ςετέʔεΛॻ͍ͯΈΔ ॳظϓϩδΣΫτͰੜ͞ΕΔΞϓϦέʔγϣϯɺ୯७ͳ7JFX͕༻ҙ͞ Ε͍ͯΔλϒߏͷΞϓϦέʔγϣϯʹͳ͍ͬͯ·͢ɻ ࠓճɺॳظͰੜ͞ΕΔΞϓϦέʔγϣϯͷεΫϩʔϧͷ֬ೝͱɺλϒ Γସ͕͑ਖ਼ৗʹߦ͑Δ͔Ͳ͏͔ͷςετΛͬͯΈ͍ͨͱࢥ͍·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); }
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ςετʹ༻͢Δ7JFXΛੜ͠·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ࢦఆͨ͠ηϨΫλΛࢀরͰ͖Δঢ়ଶʹͳΔ· Ͱɺػͯ͘͠ΕΔXBJU'PS4FMFDUPSϝιο υΛར༻ͯ͠ɺඞཁͳηϨΫλʔΛࢦఆ͠· ͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } &YU+4ଆͰ༻ͨ͠ɺॱ࣍"DUJPOΛ࣮ߦ͢Δ ͨΊͷɺDIBJOϝιουΛར༻֤ͯ͠ςετέ ʔεΛՃ͍͖ͯ͠·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, // 2秒待機 {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, // 1秒待機 {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, // 1秒待機 {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, // 1秒待機 {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} // 1秒待機 ); }); XBJUΞΫγϣϯɺEFMBZϓϩύςΟʹϛϦඵ Λࢦఆ͢Δ͜ͱͰɺ࣍ͷΞΫγϣϯΛ࣮ߦ͢Δ ·ͰػΛߦ͏ΞΫγϣϯʹͳΓ·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ESBHΞΫγϣϯɺը໘Λٖࣅతʹυϥοά͠ ͯ͘ΕΔΞΫγϣϯʹͳΓ·͢ɻ UBSHFUϓϩύςΟͰυϥοά͢ΔରΛࢦఆɺ CZϓϩύςΟʹ<Y Z>Λࢦఆ͢Δ͜ͱͰɺରͷ த৺͔ΒͲͷ͘Β͍υϥοά͢Δ͔ࢦఆ͠·͢
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ESBHΞΫγϣϯɺը໘Λٖࣅతʹυϥοά͠ ͯ͘ΕΔΞΫγϣϯʹͳΓ·͢ɻ UBSHFUϓϩύςΟͰυϥοά͢ΔରΛࢦఆɺ CZϓϩύςΟʹ<Y Z>Λࢦఆ͢Δ͜ͱͰɺରͷ த৺͔ΒͲͷ͘Β͍υϥοά͢Δ͔ࢦఆ͠·͢ ͜͜ͰɺUJUMFϓϩύςΟʹ8FMDPNFͱ͍͏จ ࣈྻ͕ࢦఆ͞Ε͍ͯΔίϯϙʔωϯτʹର͠ ͯɺը໘தԝ͔ΒԼʹQYυϥοάͨ͠ޙʹ ࠓ্ʹQYυϥοά͍ͯ͠·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ࠷ޙʹɺ5BCͷϘλϯΛަޓʹλοϓͤ͞Δ͜ ͱͰɺը໘ͷΓସ͕͑ਖ਼ৗʹߦΘΕΔ͔Λ֬ ೝ͍ͯ͠·͢ɻ
ͦΕͰɺݟͯΈ·͠ΐ͏ʂ
Ҏ্ɺ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠