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
Mockeryを読んでみたよ
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
chiroruxx
January 18, 2023
Technology
400
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Mockeryを読んでみたよ
第148回 PHP勉強会@東京のLTで使用したスライドです。
chiroruxx
January 18, 2023
Transcript
26 slides
Mockeryを 読んでみたよ 2023/01/18 第148回 PHP勉強会@東京
コードリーディングの歴史 第146回PHP勉強会 ▪ 柚⼝ ましろう さん 第147回PHP勉強会 ▪ y_sone さん
流れにのっていくしかない!! 🌊
> whoami ▪ 名前: ちひろ/ちろ/前⽥ ▪ Twitter: @chiroruxxxx ▪ 所属:
東京都⽴産業技術⼤学院⼤学 産業技術専攻 情報アーキテクチャコース 追川PBL ▪ テーマ: スクラムの理論と実践
Mockery とは ▪ モック(テストダブル)を作ってくれるライブラリ ▪ ユニットテストとかで便利
サンプルコード $user = Mockery::mock(User::class); $user->shouldReceive('getFullName') ->andReturn('テスト太郎'); $decorator = new Decorator();
$this->assertSame( '** テスト太郎 **', $decorator->decorate($user) );
サンプルコード $user = Mockery::mock(User::class); $user->shouldReceive('getFullName') ->andReturn('テスト太郎'); $decorator = new Decorator();
$this->assertSame( '** テスト太郎 **', $decorator->decorate($user) ); モックしたクラスは Userクラス︖
サンプルコード $user = Mockery::mock(User::class); $user->shouldReceive('getFullName') ->andReturn('テスト太郎'); $decorator = new Decorator();
$this->assertSame( '** テスト太郎 **', $decorator->decorate($user) ); モックしたクラスは Userクラス︖ コンストラクタで 引数が必要だけど︖
サンプルコード $user = Mockery::mock(User::class); $user->shouldReceive('getFullName') ->andReturn('テスト太郎'); $decorator = new Decorator();
$this->assertSame( '** テスト太郎 **', $decorator->decorate($user) ); モックしたクラスは Userクラス︖ コンストラクタで 引数が必要だけど︖ こんなメソッド ないけど︖
いったい何者なんだ・・・!!
コードを読んで追っていくぞ 💪
今回の⽬的 ▪ Mockery::mock(User::class) で作成されるクラスが何者なのかを追ってく ▪ 今回紹介しない話も、ブログに書いています – あしたからがんばる - Mockeryでのモックの作り⽅を調べてみた
コードを読む ▪ PhpStorm + XDebug で1⾏ずつ状態を確認しながら読める ▪ 設定がちょっとだけ⾯倒 – PHPerKaigi
2023で・・・?
None
さっそく読んでいきます
クラス定義の読み込み ▪ ファイルを読み込んでる ▪ 展開してみると・・・? $code = file_get_contents(__DIR__ . '/../Mock.php');
クラス定義の読み込み $code = ' <?php class Mock implements MockInterface {
// ... public function shouldReceive(...$methodNames) { // ... ';
クラス定義の読み込み $code = ' <?php class Mock implements MockInterface {
// ... public function shouldReceive(...$methodNames) { // ... '; 💡 モックでメソッドが使える
クラスの継承 ▪ Userクラスを継承するように書き換えてる $code = str_replace( "implements MockInterface", "extends ¥¥"
. $className . " implements MockInterface", $code );
クラスの継承 $code = ' <?php class Mock extends ¥App¥Models¥User implements
MockInterface { // ... public function shouldReceive(...$methodNames) { // ... '; 💡 User 型として扱える
クラスのロード ▪ ええい! eval じゃい! ▪ ただの⽂字列から実⾏可能な状態に eval("?>" . $definition->getCode());
クラスのロード ▪ クラスはできた!!インスタンスはまだ作ってない <?php class Mock extends ¥App¥Models¥User implements MockInterface
{ // ... public function shouldReceive(...$methodNames) { // ...
インスタンスの作成 ▪ リフレクションクラスを使って 💡コンストラクタ実⾏無しでインスタンスを作 成 ▪ ・・・⿊魔術だ!! $reflectionClass = $this->getReflectionClass($className);
return $reflectionClass->newInstanceWithoutConstructor();
インスタンスの作成
まとめ ▪ モックしたクラスは User クラス? – User クラスを継承しているのでUser型として扱える ▪ shouldRecieve
なんてメソッドは User クラスにないけど? – User クラスを継承した先で定義しているので使える ▪ コンストラクタで引数が必要だけど? – リフレクションを使ってコンストラクタ無しで⽣成してる
まとめ ▪ みんなが使ってるあのライブラリも、蓋を開ければ案外ゴリ押し ▪ みんなも気軽にゴリ押しでライブラリを作ってみては?
More Decks by chiroruxx
See All by chiroruxx
Contextとはなにか
chiroruxx
1
530
初心者エンジニアから中級者エンジニアになるためにオススメの1冊
chiroruxx
0
170
Laravelのパッケージ全部紹介する
chiroruxx
2
220
Gopher のための「自由な話し合い」ワークショップ
chiroruxx
0
65
PHPをGoで動かす
chiroruxx
0
130
Goを使ってTDDを体験しよう!
chiroruxx
1
1.5k
今ならできる!PhpStormプラグイン開発
chiroruxx
0
140
Go Connectへの想い
chiroruxx
0
250
eBPF with PHPをさわる
chiroruxx
0
220
Other Decks in Technology
See All in Technology
AI時代の組織作り:チーム開発から「個人×AI」への移行と、持続可能な「開発資本」の築き方
ham0215
2
820
Kiro アップデート 2026 年 11 月号 (11 月 8 日時点) | 目指せ Kiro マスター アップデート編
inariku
PRO
2
110
Ebitengine製iOSアプリ公開ボタンを押す会
eiei114
0
120
「いつか使う」の「いつか」は来ない 〜AI駆動開発における「作らない」判断について〜
ikki0006
0
200
Building Audio Plugin Ecosystem for Android in 2026
atsushieno
2
170
あの日、見つかっていなかったらどうなっていたか
kazzpapa3
2
120
SREのためのFinOps入門
muziyoshiz
3
1.4k
AWS Quick 入門 | 目指せ Quick マスター 01
inariku
PRO
2
310
DBTS2026 盛り上がってますか!?Databricksが実現するAI時代のデータ基盤
akuwano
1
200
プロダクションコードにおける encoding/json から encoding/json/v2 へのスムーズな移行
sansantech
PRO
1
370
bpf_arenaとstruct_opsを使うのが難しかった話
masu_mi
0
230
内製アプリとClaudeスキルのセキュリティチェック、 Backlogの課題で回しています。
ayaka_egaaa
0
170
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
WENDY [Excerpt]
tessaabrams
15
40k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
470
Become a Pro
speakerdeck
PRO
31
6.4k
AI: The stuff that nobody shows you
jnunemaker
PRO
11
1.3k
Darren the Foodie - Storyboard
khoart
PRO
5
4.1k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
350
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Producing Creativity
orderedlist
PRO
348
41k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
880
Into the Great Unknown - MozCon
thekraken
41
2.8k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
530