PHPUnit で、クラスの一部ではない関数をモックするにはどうすればよいですか?
P粉216807924
P粉216807924 2023-10-29 15:44:54
0
2
703

私が現在取り組んでいるプロジェクトには、オブジェクト指向と手続き型の PHP コードが混在しています。だから私はこのようなものを持っています:

リーリー

これらの依存関係はいくつかありますが、非常に少数です (片手で数えられるほどです)。ただし、(PHPUnit を使用して) クラスの単体テストを作成する必要がありますが、ターミナルから関数をモックする方法がわかりません (この場合は doStuff)。私の知る限り、PHPUnit のモック機能はクラスでのみ機能します。

モックなしで実行することもできましたが、問題は、これらの関数の一部が何らかの IO 操作を実行することです。何らかの方法でモックしないのは得策ではないと思います。

この問題はどうすれば解決できますか?

P粉216807924
P粉216807924

全員に返信(2)
P粉275883973

クラスがクラス外のリソースを使用したいため、唯一の選択肢は依存関係の注入です。したがって、これはいくつかのカプセル化ルールに違反します。

私がこれまでにこれを行った方法は、これらの関数を独自のクラスに配置し、それらを要求/インクルードし、テスト変数を設定するときに、同じ半「モック」関数を含むベース ファイルをインクルードすることでした。既知の状態に戻ります。

私のもう 1 つのアプローチは、これらすべてのデータ関数を含む単純な UTILITY クラスを作成し、依存関係の注入とモックを使用してそれをテストすることです。

リーリー ###テスト:### リーリー
いいねを押す +0
P粉155832941

名前空間 (グローバル名前空間で定義) から関数を呼び出し、常に修飾されていない関数を呼び出す場合は、PHP の名前空間フォールバック ポリシー を利用できます。

これにより、呼び出し元の名前空間内で関数を提供することでモックを作成できます。

作業をさらに簡単にするために、PHPUnit で使用できるライブラリ php-mock-phpunit にパッケージしました。 リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート