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
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
330
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
370
APNsからLive Activityを開始する話
yumnumm
0
150
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
310
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
120
AWSに止められる覚悟してますか?
morizo_1984
2
510
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Webの地図
yosuke_furukawa
PRO
6
5.1k
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.8k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
310
Jetpack Compose Mechanisms
skydoves
2
420
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
470
Featured
See All Featured
Docker and Python
trallard
47
4.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
4k
Why Our Code Smells
bkeepers
PRO
340
58k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Into the Great Unknown - MozCon
thekraken
41
2.8k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
450
The Pragmatic Product Professional
lauravandoore
37
7.5k
Optimising Largest Contentful Paint
csswizardry
37
4k
Done Done
chrislema
187
17k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
300
Building Flexible Design Systems
yeseniaperezcruz
330
41k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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 ΞϓϦέʔγϣϯͷେࣄͳ෦ʢ͓ۚͱ͔ʣʹؔΘΔॲཧɺ ೖग़ྗܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧɺ༷มߋ ͕ೖΓ͍͢ॲཧΛॻ͘ͳΒϢχοτςετΛॻ͜͏