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
Mockeryを読んでみたよ
Search
chiroruxx
January 18, 2023
Technology
1
260
Mockeryを読んでみたよ
第148回 PHP勉強会@東京のLTで使用したスライドです。
chiroruxx
January 18, 2023
Tweet
Share
More Decks by chiroruxx
See All by chiroruxx
eBPF with PHPをさわる
chiroruxx
0
75
sl完全に理解したつもり
chiroruxx
0
67
命名をリントする
chiroruxx
1
660
良い命名かを調べるリンターを作った + α
chiroruxx
0
74
GoLandを布教する会
chiroruxx
0
23
PHPはいつから死んでいるかの調査
chiroruxx
3
600
元phperから見たGoの良いところ
chiroruxx
0
73
Go Connectへの想い
chiroruxx
0
430
GraphQLに入門してみた
chiroruxx
2
310
Other Decks in Technology
See All in Technology
srekaigi2025-hajimete-ippo-aws
masakichieng
0
240
業務ツールをAIエージェントとつなぐ - Composio
knishioka
0
110
消し忘れリソースゼロへ!私のResource Explorer活用法
cuorain
0
140
Microsoft Ignite 2024 最新情報!Microsoft 365 Agents SDK 概要 / Microsoft Ignite 2024 latest news Microsoft 365 Agents SDK overview
karamem0
0
190
Power BI は、レポート テーマにこだわろう!テーマのティア表付き
ohata_ds
0
120
一人から始めたSREチーム3年の歩み - 求められるスキルの変化とチームのあり方 - / The three-year journey of the SRE team, which started all by myself
vtryo
7
5.7k
Enhancing SRE Using AI
yoshiiryo1
1
260
Autify Company Deck
autifyhq
2
41k
Site Reliability Engineering on Kubernetes
nwiizo
6
4.4k
2025/1/29 BigData-JAWS 勉強会 #28 (re:Invent 2024 re:Cap)/new-feature-preview-q-in-quicksight-scenarios-tried-and-tested
emiki
0
310
Windows Server 2025 へのアップグレードではまった話
tamaiyutaro
2
260
AWSエンジニアに捧ぐLangChainの歩き方
tsukuboshi
0
220
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1367
200k
Done Done
chrislema
182
16k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Designing for humans not robots
tammielis
250
25k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
380
No one is an island. Learnings from fostering a developers community.
thoeni
20
3.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Optimising Largest Contentful Paint
csswizardry
33
3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Why Our Code Smells
bkeepers
PRO
335
57k
Building Applications with DynamoDB
mza
93
6.2k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.2k
Transcript
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 クラスを継承した先で定義しているので使える ▪ コンストラクタで引数が必要だけど? – リフレクションを使ってコンストラクタ無しで⽣成してる
まとめ ▪ みんなが使ってるあのライブラリも、蓋を開ければ案外ゴリ押し ▪ みんなも気軽にゴリ押しでライブラリを作ってみては?