Laravelテストでモッキングを使用する方法
Mail :: fake()または通知:: fake()を使用してファサードを模倣し、実際の副作用なしに送信されたメッセージをアサートします。 2。カスタムサービスクラスの場合、mockery :: mock()を使用して$ this-> instance()を使用して、mocked依存関係を挿入し、recereceive( 'method') - > andreturn($ value)のような予想される動作を定義します。 3.雄弁なモデルを部分的に模倣するには、mockery :: mock(model :: class) - > makepartial()およびStub固有の方法を使用しながら、他の人を機能させます。 4.外部HTTP呼び出しの場合、http :: fake()を使用して、特定のURLのモック応答を定義し、http :: assertsent()でリクエストをアサートします。 5.テスト間の干渉を防ぐために、Teardown()でmockery :: close()を常に呼び出します。実際の実装を置き換えてLaravel分離コードをock笑し、テストが速く、繰り返し可能であり、外部システムではなくロジックに焦点を合わせます。
Laravelテストでのモッキングは、実際の実装に依存することなくコードを分離し、特定の動作をテストする強力な方法です。これは、メール、キュー、API、データベースなどのサービスを扱う場合に特に役立ちます。 Laravelは、Phpunitを介したock笑と、箱から出したMockery
のような独自のヘルパーをock笑するための組み込みサポートを提供しています。
Laravelテストでモッキングを効果的に使用する方法は次のとおりです。
1。 fake()
を使用したモッキングファサードまたはshouldReceive()
Laravel Facades( Mail
、 Notification
、 Event
、 Queue
)はfake()
メソッドまたはshouldReceive()
を使用して簡単にock笑できます。
fake()
を使用する(ファサードに推奨)
これは、ほとんどのLaravel Facadesにとって最もクリーンな方法です。
Illuminate \ support \ facades \ mailを使用します。 パブリック関数test_order_sends_email() { メール:: fake(); //実際の電子メールが送信されないようにします $ user = user :: factory() - > create(); $ this-> post( '/orders'、[ 'user_id' => $ user-> id、 「製品」=> 'Laravel Shirt'、 ]); //メールが送信されなかったと主張しています... メール:: assertnothingsent(); //または特定の郵送可能が送信されました メール:: assertsent(注文:: class、function($ mail)use($ user){ 返信$ mail-> user-> id === $ user-> id; }); }
使用:
Notification
、Event
、Queue
、Storage
、Bus
など。
2。サービスクラスをock笑するためにockeryを使用します
依存関係注射(コントローラーやジョブなど)を使用している場合、 Mockery
を使用してそれらのサービスをock笑することができます。
例:支払いゲートウェイをock笑します
サービスPaymentProcessor
がコントローラーに注入されているとします。
//テストで app \ services \ paynedprocessorを使用します。 mockeryを使用してください。 パブリック関数test_payment_processes_successly() { $ mock = mockery :: mock(paymentprocessor :: class); $ mock-> sefstreceive( 'charge') - > and() - > andreturn(true); $ this-> instance(paymentprocessor :: class、$ mock); $ response = $ this-> post( '/pay'、[ 「金額」=> 100、 ]); $ response-> assertredirect(); $ this-> assertdatabasehas( 'Payments'、['bument' => 100]); }
-
shouldReceive('charge')
Laravelに1回の呼び出しcharge()
を期待するように指示します。 -
andReturn(true)
返品値を定義します。 -
$this->instance()
モックをlaravelサービスコンテナにバインドします。
これにより、テストが実際の支払いAPIにヒットしないようにします。
3。雄弁さモデル(部分モック)のモッキングメソッド
モデルを中心にロジックをテストしたいが、特定の方法( save()
やイベントトリガーなど)が実行されない場合があります。
app \ models \ userを使用してください。 mockeryを使用してください。 パブリック関数test_user_registration_with_mocked_save() { $ user = mockery :: mock(user :: class) - > makepartial(); $ user-> sefseceive( 'save') - > and() - > andreturn(true); //コントローラーロジックに注入または使用します $ this-> app-> instance(user :: class、$ user); $ response = $ this-> post( '/Register'、[ 'name' => 'John Doe'、 「電子メール」=> 'john@example.com'、 「パスワード」=>「秘密」、 ]); $ response-> assertok(); }
makePartial()
を使用して、特定の方法のみをockし、他の方法を現実に保ちます。
4。HTTPクライアントのモッキング(外部API)
LaravelのHttp
ファサードを使用すると、外部HTTP呼び出しを偽造できます。
Illuminate \ support \ facades \ httpを使用します。 パブリック関数test_external_api_call_is_mocked() { http :: fake([[ 'api.github.com*' => http :: response(['name' => 'laravel']、200)、 ]); $ response = http :: get( 'https://api.github.com/repos/laravel/framework'); $ this-> assertequals( 'laravel'、$ response ['name']); http :: assertsent(function($ request){ $ request-> url()=== 'https://api.github.com/repos/laravel/framework'; }); }
-
Http::fake()
実際のhttpリクエストを防ぎます。 - 特定のURLの応答を定義できます。
-
assertSent()
またはassertPending()
を使用して、リクエストを確認します。
5。テスト間のモックのクリア
複数のテスト方法でモックを使用している場合は、必ずクリーンアップしてください。
Laravelはfake()
でFacadesを使用している場合に自動的にこれを処理しますが、 Mockery
を使用して、次のことを追加する必要があります。
保護された関数分解():void { mockery :: close(); 親::涙(); }
これにより、テスト間の「すでにock笑された」エラーが回避されます。
重要なテクニックの概要
使用事例 | 方法 |
---|---|
メール、通知、キュー |
Mail::fake() 、 Notification::fake()
|
カスタムサービスクラス |
Mockery::mock() $this->instance()
|
モデル方法 | Mockery::mock(Model::class)->makePartial() |
HTTP呼び出し | Http::fake() |
相互作用を確認します |
assertSent() 、 assertDispatched() など。 |
モッキングは、テストを迅速に、信頼性、焦点を維持するのに役立ちます。それを使用して、外部依存関係をシミュレートし、副作用を回避し、コードがサービスと正しく対話していることを確認します。
覚えておいてください:テスト中の動作を分離するために必要なものをock笑しないでください。
基本的に、Laravel Facadesにfake()
を使用し、カスタムクラスにはMockery
使用します。パターンをダウンしても複雑ではありません。
以上がLaravelテストでモッキングを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

紹介テーブルを作成して、紹介、紹介、推奨コード、使用時間を含む推奨関係を記録します。 2.推奨データを管理するために、ユーザーモデルのBelongStomanyとHasmanyの関係を定義します。 3.登録時に一意の推奨コードを生成します(モデルイベントを通じて実装できます)。 4.登録中にパラメーターをクエリすることにより、推奨コードをキャプチャし、検証後に推奨関係を確立し、自己称賛を防ぎます。 5.推奨されるユーザーが指定された動作(サブスクリプション順序)を完了した場合、報酬メカニズムをトリガーします。 6.共有可能な推奨リンクを生成し、Laravel Signature URLを使用してセキュリティを強化します。 7.推奨事項の総数や変換された番号など、ダッシュボードに推奨統計を表示します。データベースの制約、セッション、またはCookieが持続することを確認する必要があります。

CheckPhp> = 8.1、Composer、およびWebserver; 2.CloneOrCreateProjectAndRunComposErinStall; 3.Copy.Env.Exampleto.ENVANDRUNPHPARTISANKEY :generate; 4.setDatabaseCredentialSin.EnvandrunphpartisanMigrate-- Seed; 5.StartServerWithPhpartisEnserve; 6.optionallyrunnpmins

シーダーファイルの作成:phpartisanmake:seederuserseederを使用してシーダークラスを生成し、実行方法のモデルファクトリーまたはデータベースクエリを介してデータを挿入します。 2。Databaseseederで他のシーダーを呼び出す:sulderseeder、Postseederなどを登録$ this-> call()を介して依存関係が正しいことを確認します。 3。シーダーの実行:PHPARTISANDBを実行する:種子をすべて登録したすべてのシーダーを実行するか、PHPARTISANMIGRATE:FRESS-シードを使用してデータをリセットして補充します。 4

chooseafeatureflagstrategysuchasconfigベース、データベース駆動型、orhird-partytoolslikeflagsmith.2.setupadatabase-drivensystemby-drivensystemmigrationforafeature_flagstablewithname、evanabled、andrulesfields、thenrunthigration.3

新しいLaravelプロジェクトを作成し、サービスを開始します。 2。モデル、移行、コントローラーを生成し、移行を実行します。 3.ルート/api.phpのRESTFULルートを定義します。 4.ポストコントローラーに追加、削除、変更、クエリメソッドを実装し、JSON応答を返します。 5. PostmanまたはCurlを使用して、API関数をテストします。 6.オプションで、Sanctumを介してAPI認証を追加します。最後に、実用的なアプリケーションに適した、完全かつ拡張可能なLaravelRestapiの明確な構造を取得します。

Eloquentormは、Laravelの組み込みオブジェクトリレーショナルマッピングシステムです。ネイティブSQLの代わりにPHP構文を介してデータベースを操作し、コードをより簡潔でメンテナンスしやすくします。 1.各データテーブルはモデルクラスに対応し、各レコードはモデルインスタンスとして存在します。 2。アクティブレコードモードを採用すると、モデルインスタンスを単独で保存または更新できます。 3。サポートバッチ割り当て、およびセキュリティを確保するために$充填可能な属性をモデルで定義する必要があります。 4. 1対1、1対10、多目的などなど、強力な関係サポートを提供し、メソッド呼び出しを介して関連するデータにアクセスできます。 5。クエリを構築するために、Orderbyおよびその他のメソッドをChainedと呼ぶことができる統合クエリコンストラクター。 6。属性を取得または設定するときに数値をフォーマットできるアクセサと修飾子をサポートします。

リポジトリパターンは、データアクセスロジックからビジネスロジックを切り離すために使用される設計パターンです。 1.インターフェイス(契約)を介してデータアクセスメソッドを定義します。 2。特定の操作は、リポジトリクラスによって実装されます。 3.コントローラーは、依存関係噴射を介してインターフェイスを使用し、データソースに直接接触しません。 4.利点には、きちんとしたコード、強力なテスト可能性、簡単なメンテナンス、チームのコラボレーションが含まれます。 5。中規模および大規模なプロジェクトに適用されると、小規模プロジェクトはモデルを直接使用できます。

eagerloadingpreventshen 1 queryproblembyloadingRelationhipsupfront.then 1problemoccurswhen1queryfetchesrecords(例:100posts)およびnadditionalquedrelateddata(例:authoreachpost)、resultingin101kerisedis.eerdiesfixesthis.
