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
importをモックする話
Search
Sota Sugiura
June 20, 2016
Programming
2.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
importをモックする話
Meguro.es #4 で発表しました。
Sota Sugiura
June 20, 2016
More Decks by Sota Sugiura
See All by Sota Sugiura
内製したSlack Appで頑張るIncident Response@Waroom Meetup #1 / Incident Response with Slack App in 10X
sota1235
0
2k
20220926_セキュリティチームの今_for_Drs._Prime_公開用.pdf
sota1235
0
200
再発防止策を考える技術 / #phpconsen
sota1235
10
4.1k
How to choose the best npm module for your team?
sota1235
9
670
Realtime Database for high traffic production application
sota1235
7
4.3k
Road to migrate JP Web as a microservice
sota1235
4
1.8k
インターフェース再入門 / Think Interface again
sota1235
6
11k
再発防止策を考える技術 #phpconfuk_rej
sota1235
1
1.4k
Update around Firebase #io18
sota1235
3
4.5k
Other Decks in Programming
See All in Programming
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
190
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.3k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
440
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
230
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
260
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.7k
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
900
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
450
数百円から始めるRuby電子工作
tarosay
0
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
300
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
480
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
BBQ
matthewcrist
89
10k
How STYLIGHT went responsive
nonsquared
100
6.2k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
270
Color Theory Basics | Prateek | Gurzu
gurzu
0
400
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Become a Pro
speakerdeck
PRO
31
6k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Transcript
JNQPSUΛϞοΫ͢Δ .FHVSPFT!8BOUFEMZ !TPUB
XIPBNJ w 4PUB4VHJVSB !TPUB w ͪΌΜͱ+4͘Β͍ w ෆಈલࡏॅ w
͍͍ͩͨࠇ w גࣜձࣾΞΠελΠϧ
ςετͷ
͜ΜͳϞδϡʔϧ // checker.js // ࠇ۠ຽҰཡΛimport import people from 'people'; /**
* @description ࠇ۠ຽ͔Ͳ͏͔νΣοΫ͢Δ * @param {String} name * @return {Boolean} */ export default function isMeguroJser(name) { return (people.indexOf(name) > 0); }
ςετํ๏Λߟ͑ͯΈΔ
ৼΔ͍Λߟ͑Δ w ඇࠃຽඇࠇ۠ຽΛͨ͠ΒGBMTFΛฦ͢ w ࠃຽࠇ۠ຽΛͨ͠ΒUSVFΛฦ͢ w ؆୯͡ΌΜ
վΊͯ // checker.js // ࠇ۠ຽҰཡΛimport import people from 'people'; /**
* @description ࠇ۠ຽ͔Ͳ͏͔νΣοΫ͢Δ * @param {String} name * @return {Boolean} */ export default function isMeguroJser(name) { return (people.indexOf(name) > 0); }
վΊͯ // checker.js // ࠇ۠ຽҰཡΛimport import people from 'people'; /**
* @description ࠇ۠ຽ͔Ͳ͏͔νΣοΫ͢Δ * @param {String} name * @return {Boolean} */ export default function isMeguroJser(name) { return (people.indexOf(name) > 0); } QFPQMFྻʹ ໊લ͕͋Δ͔ݟͯΔ
վΊͯ // checker.js // ࠇ۠ຽҰཡΛimport import people from 'people'; /**
* @description ࠇ۠ຽ͔Ͳ͏͔νΣοΫ͢Δ * @param {String} name * @return {Boolean} */ export default function isMeguroJser(name) { return (people.indexOf(name) > 0); } QFPQMFྻʹ ໊લ͕͋Δ͔ݟͯΔ ͜͜ͰQFPQMFΛ JNQPSUͯ͠Δ
QFPQMFKT // people.js /** @type {Array} ࠇ۠ຽͷօ༷ */ export default
[ 'sota1235', 'sota1236', 'sota1237', ]
QFPQMFKT // people.js /** @type {Array} ࠇ۠ຽͷօ༷ */ export default
[ 'sota1235', 'sota1236', 'sota1237', ] bTPUB`͕USVF bTPUB`͕GBMTFͳΒΑͦ͞͏
// test.js import assert from 'assert'; import checker from './checker';
describe('Test for checker.js', () => { it(‘sota1235ࠃຽ :)', done => { assert(checker('sota1235')); done(); }); it(‘sota1238ඇࠃຽ :(', done => { assert(!checker('sota1238')); done(); }); });
ςετॻ͚ͨʂ w ͜ΕͰࠇ+4FSͷબผᘳ w อकͰ͖Δ࣭ͷߴ͍ςετ͕ॻ͚ͨ w JNQPSUΛϞοΫ͢ΔඞཁͳΜͯͳ͔ͬͨΜ
ͱ͍͔ͳ͍ w ͜ͷςετʹવͳ͕Β͕݀͋Δ w ҎԼͷέʔεʹରԠͰ͖ͳ͍ w TPUB͕ࠇ۠֎Ҡॅ͢Δ w TPUB͕ࠇ۠Ҡॅ͢Δ
UFTUKT // test.js import assert from 'assert'; import checker from
'./checker'; describe('Test for checker.js', () => { it(‘sota1235ࠃຽ :)', done => { assert(checker('sota1235')); done(); }); it(‘sota1238ඇࠃຽ :(', done => { assert(!checker('sota1238')); done(); }); }); TPUB͕ ࠇ۠ʹӬॅ͢Δલఏ
UFTUKT // test.js import assert from 'assert'; import checker from
'./checker'; describe('Test for checker.js', () => { it(‘sota1235ࠃຽ :)', done => { assert(checker('sota1235')); done(); }); it(‘sota1238ඇࠃຽ :(', done => { assert(!checker('sota1238')); done(); }); }); TPUB͕ ࠇ۠ʹӬॅ͢Δલఏ TPUB͕ ࠇ۠ʹདྷͳ͍લఏ
ͭΒ͍ w ςετ͍ͨ͠Ϟδϡʔϧͷॲཧ͕·ͨผͷϞδϡʔ ϧʹґଘ͍ͯ͠Δ w ϢχοτςετͷͨΊʹࠇ۠Ӭॅͱ͍͏ۤߦ
ࠇ۠Ҏ֎Ͱʜ w ҎԼͷ༷ͳॲཧςετ͕ॻ͖ͮΒ͍ w "1*ॲཧ w %#ૢ࡞ w %0.ૢ࡞ w
ؤுͬͯςετ༻࡞͍͍͚ͬͯͲ͊͞ʜ
Ͳ͏͢Δ͔ w ґଘϞδϡʔϧΛελϒʹࠩ͠ସ͑ͨϞοΫΛ ࡞Ζ͏
DIFDLFSKT // checker.js // ࠇ۠ຽҰཡΛimport import people from 'meguro'; /**
* @description ࠇ۠ຽ͔Ͳ͏͔νΣοΫ͢Δ * @param {String} name * @return {Boolean} */ export default function isMeguroJser(name) { return (people.indexOf(name) > 0); } ςετͷ͚࣌ͩ ͜͜Λελϒʹ͢Δ
Ͳ͏ͬͯ Ňŏ﹏ŏ ʁ
͓·ͨͤ
QSPYZRVJSFKT w ຊͷຊ w ҰݴͰݴ͏ͱʮJNQPSUΛϞοΫ͢ΔʯͨΊͷ OQNϥΠϒϥϦ w ͍ํ͕ඇৗʹγϯϓϧ
QSPYZRVJSFKT w ෦࣮JNQPSUͷϥούʔ w JNQPSU͢ΔϞδϡʔϧ͕ͨ͠ελϒΛJNQPSU ͢ΔΑ͏ʹࡉ͢Δ
ී௨ͷJNQPSU JNQPSU JNQPSU
QSPYZRVJSFKT JNQPSU JNQPSU ҙͷϞδϡʔϧΛ ελϒʹͰ͖Δ
ͬͯΈΑ͏ʂ
QFPQMFKTΛελϒʹ͢Δ UFTUKT DIFDLFSKT ελϒ QFPQMFKT JNQPSUQFPQMFGSPNbQFPQMF` Ͱελϒ͕ฦΔ༻ʹ͢Δ
DIFDLFSKTΛϞοΫ import proxyquire from 'proxyquire'; const stubs = { people:
[ 'sota4567', 'sota4568', ], }; const mockChecker = proxyquire('./checker', stubs);
DIFDLFSKTΛϞοΫ import proxyquire from 'proxyquire'; const stubs = { people:
[ 'sota4567', 'sota4568', ], }; const mockChecker = proxyquire('./checker', stubs); ୈҰҾʹελϒΛೖ͢ΔϞδϡʔϧ NPDL$IFDLFSʹೖΔͷ͜ͷϞδϡʔϧ
DIFDLFSKTΛϞοΫ import proxyquire from 'proxyquire'; const stubs = { people:
[ 'sota4567', 'sota4568', ], }; const mockChecker = proxyquire('./checker', stubs); ୈೋҾʹελϒ
DIFDLFSKTΛϞοΫ import proxyquire from 'proxyquire'; const stubs = { people:
[ 'sota4567', 'sota4568', ], }; const mockChecker = proxyquire('./checker', stubs); ୈೋҾʹελϒ ελϒ͍ͨ͠ϞδϡʔϧΛ LFZWBMVFܗࣜͰ͢
मਖ਼൛UFTUKT // test.js import assert from 'assert'; import proxyquire from
'proxyquire'; describe('Test for checker.js', () => { it(‘sota1235ࠃຽ :)', done => { const checkerMock = proxyquire('./checker', { people: ['sota1235'], }); assert(checkerMock('sota1235')); done(); }); it('sota1238ඇࠃຽ :(', done => { const checkerMock = proxyquire('./checker', { people: [], }); assert(!checker('sota1238')); done(); }); });
TPUBࠃຽ // test.js import assert from 'assert'; import proxyquire from
'proxyquire'; describe('Test for checker.js', () => { it('sota1235ࠃຽ :)', done => { const checkerMock = proxyquire('./checker', { people: ['sota1235'], }); assert(checkerMock('sota1235')); done(); }); }); QFPQMFϞδϡʔϧΛελϒ bTPUB`ؚ͕·ΕΔ
TPUBඇࠃຽ // test.js import assert from 'assert'; import proxyquire from
'proxyquire'; describe('Test for checker.js', () => { it('sota1238ඇࠃຽ :(', done => { const checkerMock = proxyquire('./checker', { people: [], }); assert(!checker('sota1238')); done(); }); }); QFPQMFϞδϡʔϧΛελϒ ۠ຽ͕୭͍ͳ͍͜ͱʹ
.JTTJPO$PNQMFUF w JNQPSUΛελϒʹͰ͖ͨʂ
ॴײ w ෦࣮ݟ͚ͨͲ͖ͪΜͱ࡞ͬͯ͋Δ͠ΨϯΨ ϯ͍͍͑ͱࢥ͏ w ֶशίετΊͪΌͪ͘Ό͍ w ҰԠ͍Ζ͍ΖΦϓγϣϯ͋Δ͚Ͳݸਓతʹ ඪ४ػೳͰॆ w
ΈΜͳ͓͏
ͪͳΈʹ w ࣅͨͷͰSFXJSFKTͱ͍͏ͷ͋Δ w QSPYZRVJSFઌʹελϒೖ͢Δ͚ͲSFXJSF TFUUFS HFUUFS͕͋Δ w Ͳ͕͍͍ͬͪͱ͔ݸਓతʹͳ͍ͷͰ͓ΈͰ Ͳ͏ͧ
Ҏ্ʂ