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
Unit Testing Laravel
Search
nunulk
November 14, 2018
Programming
510
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
高専キャリア LT 発表内容
crysta1221
6
5.4k
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
730
バグを直したら useEffect が消えた
colorful12
3
790
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
790
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
280
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
500
Deep dive into the select statement (GopherCon UK)
jespino
0
160
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
260
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
400
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
130
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
370
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.8k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Building the Perfect Custom Keyboard
takai
2
860
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Statistics for Hackers
jakevdp
799
230k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
New Earth Scene 8
popppiees
3
2.5k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
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 ΞϓϦέʔγϣϯͷେࣄͳ෦ʢ͓ۚͱ͔ʣʹؔΘΔॲཧɺ ೖग़ྗܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧɺ༷มߋ ͕ೖΓ͍͢ॲཧΛॻ͘ͳΒϢχοτςετΛॻ͜͏