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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
300
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
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
560
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
130
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.3k
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
110
FDEが実現するAI駆動経営の現在地
gonta
2
250
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
130
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
200
霧の中の代数的エフェクト
funnyycat
1
450
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
260
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
220
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
190
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Documentation Writing (for coders)
carmenintech
77
5.4k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Mind Mapping
helmedeiros
PRO
1
290
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
780
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
460
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 ΞϓϦέʔγϣϯͷେࣄͳ෦ʢ͓ۚͱ͔ʣʹؔΘΔॲཧɺ ೖग़ྗܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧɺ༷มߋ ͕ೖΓ͍͢ॲཧΛॻ͘ͳΒϢχοτςετΛॻ͜͏