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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
280
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
230
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
120
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
140
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
7
3.5k
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.7k
新卒PdEのリアル
ryu1013
1
480
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.4k
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
3
510
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
200
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
490
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Paper Plane
katiecoart
PRO
3
53k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
490
Technical Leadership for Architectural Decision Making
baasie
3
560
Faster Mobile Websites
deanohume
310
32k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
570
HDC tutorial
michielstock
2
860
Joys of Absence: A Defence of Solitary Play
codingconduct
1
500
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
Done Done
chrislema
186
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.7k
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 ΞϓϦέʔγϣϯͷେࣄͳ෦ʢ͓ۚͱ͔ʣʹؔΘΔॲཧɺ ೖग़ྗܭࢉͷύλʔϯ͕ͨ͘͞Μ͋Δॲཧɺ༷มߋ ͕ೖΓ͍͢ॲཧΛॻ͘ͳΒϢχοτςετΛॻ͜͏