Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Unit Testing Laravel
Search
nunulk
November 14, 2018
Programming
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Unit Testing Laravel
nunulk
November 14, 2018
More Decks by nunulk
See All by nunulk
Laravelでテストしやすいコードを書く5 / 5 tips of building testable modules in Laravel
nunulk
0
350
Design It! in a nutshell
nunulk
1
310
PHP Getting Faster
nunulk
0
290
How does learning English broaden your world?
nunulk
0
420
Testing on Laravel
nunulk
1
1.6k
Vue.js + TypeScript + Firebase
nunulk
0
970
Nuxt.js in TypeScript
nunulk
1
460
A startup meets Laravel + Vue.js
nunulk
1
2.1k
A Third-rate Programmer Talked about a Survival Strategy for Software Engineers
nunulk
3
610
Other Decks in Programming
See All in Programming
ソフトウェアラスタライザ
fadis
1
800
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
120
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
3
500
Press start. Python's next generation.
willingc
PRO
3
330
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
Family mrubyの進捗
kishima
1
110
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
スマート反転とウェブアクセシビリティ
camiha
0
180
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
700
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
140
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Paper Plane (Part 1)
katiecoart
PRO
1
11k
Become a Pro
speakerdeck
PRO
31
6.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The Language of Interfaces
destraynor
162
27k
First, design no harm
axbom
PRO
2
1.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Transcript
Unit Testing Laravel nunulk Laravel Meetup Okinawa ୈ7ճ
ຊ͢͜ͱ w ࣗݾհ w Ϣχοτςετͱ w 1)16OJUʹ͍ͭͯ w -BSBWFMʹΑΔ1)16OJUͷ֦ுػೳʹ͍ͭͯ w
ςετͷ༏ઌॱҐʹ͍ͭͯ
ࣗݾհ
ࣗݾհ • nunulkʢ͵͵Δ͘ʣ • ౦ژ͔Βདྷ·ͨ͠ʢ4ധ5ʣ • ϑϦʔϥϯεͷϓϩάϥϚʢࡾྲྀʣ • ͖ͳٕज़: PHP/Laravel/TypeScript/Vue.js/Elixir/
Scala/Nim
Ϣχοτςετ
Ϣχοτςετͱ w Ϋϥεؔʢϝιουʣ୯ҐͰ࡞͠ɺͦͷΫϥε ؔͷॲཧΛςετ͢Δ w ϗϫΠτϘοΫεςετΛ࡞͢Δʢ݅ذɺೖྗύϥ ϝʔλͷ༰ʹґଘ͢Δॲཧʣ w ϒϥοΫϘοΫεςετΛ࡞͢Δʢఆ͞ΕΔೖྗύϥ ϝʔλ͔ΒύλʔϯΛબͿɻڥքɺҟৗɺFUDʣ
w ґଘؔϞοΫελϒͰஔ͖͑Δ
Ϣχοτςετʹదͨ͠γνϡΤʔγϣϯ w ܭࢉ w ݅ఆ w ม
Ϣχοτςετͷྫʢܭࢉʣ // test public function testRemainingHousrs() { $today = Carbon::today();
$task = factory(Task::class)->make([ 'due' => Carbon::tomorrow() ]); $this->assertSame(24, $task->remainingHours($today)); } // production public function remainingHours(Carbon $datetime): int { return $this->due->diffInHours($datetime); }
Ϣχοτςετͷྫʢ݅ఆʣ // test public function testIsOverdue() { $now = Carbon::now();
$task = factory(Task::class)->make([ 'due' => Carbon::yesterday() ]); $this->assertTrue($task->isOverdue($now)); } // production public function isOverdue(Carbon $datetime): bool { return $this->due->lessThan($datetime); }
Ϣχοτςετͷྫʢมʣ public function testToArrayInvisiblePassword() { $user = factory(User::class)->make(); $this->assertArrayNotHasKey('password', $user->toArray());
$this->assertArrayHasKey('email', $user->toArray()); }
PHPUnit
PHPUnit w ΞαʔγϣϯBTTFSU&RVBMT BTTFSU4BNF BTTFSU5SVF BTTFSU'BMTF BTTFSU$POUBJOT BTTFSU/VMM BTTFSU5IBU
FUD w Ξϊςʔγϣϯ!EBUB1SPWJEFS !FYQFDUFE&YDFQUJPO !HSPVQ FUD w ίʔυΧόϨοδ
LaravelʹΑΔ֦ு
PHPUnit in Laravel w .PDLFSZ 'BLFSΛόϯυϧ w .PEFM'BDUPSZ 'BLFS w
'BDBEF .PDLFSZ w %*ίϯςφΛͬͨ.PDLJOH w ศརτϨΠτ *OUFSBDUT8JUI"VUIFOUJDBUJPO .PDLT"QQMJDBUJPO4FSWJDFT *OUFSBDUT8JUI%BUBCBTF3FGSFTI%BUBCBTF %BUBCBTF5SBOTBDUJPOT FUD
Mockery $task = factory(Task::class) ->states(['doing', 'high']) ->create(); Mockery::mock(TaskRepository::class) ->shouldReceive('find') ->once()
->andReturn($task); Mockery::mock(Log::class) ->shouldReceive(‘debug') ->once() ->andReturnUsing(function ($subject, $body) { // ͜ͷதͰΞαʔγϣϯ͕Ͱ͖·͢ $this->assertContains('Laravel', $body); });
Model Factory, Faker $factory->define(Task::class, function (Faker $faker) { return [
'subject' => $faker->sentence, 'priority' => Priority::default(), 'status' => Status::default(), ]; }); $factory->state(Task::class, 'doing', function () { return [ 'status' => Status::DOING(), ]; }); factory(Task::class)->states(['doing', 'high'])->create();
ςετͷ༏ઌॱҐ
ςετͷ༏ઌॱҐ ΞϓϦέʔγϣϯͷେࣄͳ෦ʢ͓ۚͱ͔ʣʹؔΘΔॲ ཧ ˠ࣮֬ʹνΣοΫ͢ΔͨΊʹࣗಈԽ ೖग़ྗܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧ ˠͨ͘͞Μςετ͢Δͷ͕ΊΜͲ͍͘͞ͷͰࣗಈԽ ༷มߋ͕ೖΓ͍͢ॲཧ
ˠมΘΔͨͼʹςετ͢Δͷ͕ΊΜͲ͍͘͞ͷͰࣗಈԽ
·ͱΊ w -BSBWFMͳΒΦʔϧΠϯϫϯύοέʔδͳςετ͕Ͱ͖Δ w ܭࢉɺఆɺมΛΔͳΒϢχοτςετΛॻ͜͏ w ΞϓϦέʔγϣϯͷେࣄͳ෦ʢ͓ۚͱ͔ʣʹؔΘΔॲཧɺ ೖग़ྗܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧɺ༷มߋ ͕ೖΓ͍͢ॲཧΛॻ͘ͳΒϢχοτςετΛॻ͜͏