目次
シミュレーションとは何ですか?
単体テストを作成
上記の例は非常に簡単です。パラメーターはありませんが、簡単な呼び出しです。物事をもっと複雑にしましょう。
ock笑の期待を定義する方法は?
ホームページ バックエンド開発 PHPチュートリアル モッケリーでテスト依存関係をock笑します

モッケリーでテスト依存関係をock笑します

Feb 20, 2025 am 09:07 AM

Mock your Test Dependencies with Mockery

誰もがこれを行っているわけではありませんが、アプリケーションをテストすることは、開発者であることの最も基本的な部分の1つです。ユニットテストは最も一般的なテストです。ユニットテストを使用すると、クラスが期待どおりに実行されているかどうかを確認できます。時には、アプリケーションでサードパーティサービスを使用している場合があり、ユニットテストのためにすべてをセットアップすることは困難です。これは、シミュレーションが機能するときです。

キーポイント

  • モッキングは、単体テストで実際のオブジェクトの代替品を作成するプロセスです。これは、依存関係の注入に大きく依存するアプリケーションをテストするときに特に役立ちます。
  • mockeryは、パドライックブレイディによって作成されたライブラリで、ユニットテストでオブジェクトをモックするために使用できるライブラリであり、Phpunitのデフォルトのモッキング機能に代わるものを提供します。
  • mockeryを使用すると、開発者はメソッド呼び出しの数、受信するパラメーター、および返される値に対する期待を定義し、単体テストで依存関係を分離するための強力なツールになります。
  • phpunitはすでにオブジェクトをock笑することができますが、mockeryは、単体テストが他のクラスの影響を受けないようにしたい開発者に、より柔軟性と利便性を高めます。

シミュレーションとは何ですか?

オブジェクトをock笑することは、単体テストで実際のオブジェクトを置き換える代替オブジェクトを作成することにすぎません。アプリケーションが依存関係の注入に大きく依存している場合、モッキングは実行可能な方法です。

オブジェクトをock笑する理由はいくつかあるかもしれません:

  1. ユニットテストを実行するときにクラスを分離することが最善です。別のクラスやサービスがユニットテストに干渉する必要はありません。
  2. オブジェクトはまだ存在していません。最初にテストを作成してから、最終オブジェクトを作成できます。
  3. モックオブジェクトは通常、テスト用のデータベース全体を準備するよりも速いです。

ユニットテストを実行するときにphpunitを使用している場合があります。 Phpunitには、ドキュメントに示すように、いくつかのデフォルトシミュレーション機能が付属しています。 Jeune Asuncionが書いたこの記事では、PHPunitのシミュレーションとシミュレーション機能の詳細について詳しく説明できます。

この記事では、PádraicBradyによって作成された図書館のock笑に飛び込みます。現在存在しない気象サービスを注入する温度クラスを作成します。

設定

プロジェクトをセットアップすることから始めましょう。次のコンテンツを含むcomposer.jsonファイルから始めます。これにより、mockeryとphpunitが確実に行われます。

また、
<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
phpunit.xml

と呼ばれるphpunit構成ファイルも作成します

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
このリスナーを定義することが重要です。リスナーがいない場合、メソッド

once()twice()が誤って使用されている場合、エラーは発生しません。これについては、後で詳しく説明します。 times() また、2つのディレクトリを作成しました。 SRCディレクトリはクラスを保持するために使用され、テストディレクトリはテストの保存に使用されます。 SRCディレクトリで、SitePointWeatherのパスを作成しました。

最初にWeatherServiceInterfaceを作成します。存在しない気象サービスは、このインターフェイスを実装します。この場合、摂氏の温度を与える方法は1つだけです。

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

したがって、摂氏温度を提供するサービスがあります。華氏を手に入れたいです。これを行うために、TemperatureServiceという新しいクラスを作成しました。このサービスは気象サービスを注入します。これに加えて、摂氏を華氏に変換する方法も定義します。

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

単体テストを作成

ユニットテストをセットアップする準備ができました。 Testsディレクトリに温度ViseTestクラスを作成します。このクラスでは、華氏メソッドをテストするメソッドを作成します。 testGetTempFahrenheit() この方法で行う最初のステップは、新しい温度サービスオブジェクトを作成することです。これと同じように、コンストラクターはWeatherServiceInterfaceを実装するオブジェクトを要求します。私たちはまだそのようなオブジェクトを持っていないので(私たちもそれを望んでいません)、私たちは私たちのために模擬オブジェクトを作成するためにmockeryを使用します。完了後の方法を見てみましょう。

最初にモックオブジェクトを作成します。 mockeryをmockery(またはインターフェイス)にock笑したいのかを伝えます。 2番目のステップは、このモックオブジェクトで呼び出される方法を記述することです。
namespace SitePoint\Weather;

interface WeatherServiceInterface
{
    /**
     * 返回摄氏温度
     *
     * @return float
     */
    public function getTempCelsius();
}
ログイン後にコピー
メソッドでは、呼び出されるメソッドの名前を定義します。

shouldReceive()この方法が呼び出される回数を定義します。

once()を使用できます。この場合、一度だけ呼ばれると予想されます。呼び出されていない場合、または過度の呼び出しが呼び出された場合、単位テストは失敗します。 twice() times(X)最後に、

メソッドで返される値を定義します。この場合、25を返します。 mockeryには、

andReturn()andReturnNull()などの返品方法もあります。それがあなたが期待するものであれば、ockeryは例外を投げることもできます。 andReturnSelf() andReturnUndefined()温度サービスオブジェクトを作成し、通常どおりにテストできるモックオブジェクトがあります。摂氏25度は華氏77度です。そのため、

メソッドから77を受け取るかどうかを確認します。

getTempFahrenheit()ルートディレクトリで

を実行すると、phpunitから緑色の光が得られ、すべてが完璧であることを示します。

vendor/bin/phpunit tests/Advanced使用法

上記の例は非常に簡単です。パラメーターはありませんが、簡単な呼び出しです。物事をもっと複雑にしましょう。

私たちの気象サービスには、正確な時間に温度を取得する方法もあると仮定します。現在のWeatherServiceInterfaceに次の方法を追加します。

平均温度が午後0時から午後6時までの間にあるかどうかを知りたいと思っています。これを行うために、温度サービスで新しい方法を作成して、平均温度を計算します。これを行うために、WeatherServiceから7つの温度を取得し、平均を計算します。
namespace SitePoint\Weather;

class TemperatureService
{
    /**
     * @var WeatherServiceInterace $weatherService 保存天气服务
     */
    private $weatherService;

    /**
     * 构造函数。
     *
     * @param WeatherServiceInterface $weatherService
     */
    public function __construct(WeatherServiceInterface $weatherService) {
        $this->weatherService = $weatherService;
    }

    /**
     * 获取当前华氏温度
     *
     * @return float
     */
    public function getTempFahrenheit() {
        return ($this->weatherService->getTempCelsius() * 1.8000) + 32;
    }
}
ログイン後にコピー
<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

テスト方法を見てみましょう。

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

インターフェイスをもう一度シミュレートし、呼び出される方法を定義します。次に、この方法が呼び出される回数を定義します。前の例でonce()を使用しましたが、この方法を7回呼び出すと予想されることを示します。メソッドが正確に7回呼び出されない場合、テストは失敗します。 phpunit.xml構成ファイルでリスナーを定義しない場合、これに関する通知を受信しません。 times(7)

次に、

メソッドを定義します。 with()メソッドでは、期待するパラメーターを定義できます。この場合、7つの異なる時間が予想されます。 with

最後に、

メソッドがあります。この場合、7つの返品値を示します。より少ない返品値を定義すると、最後に利用可能な返品値が毎回繰り返されます。 andReturn()

もちろん、ock笑はもっと多くのことをすることができます。完全なガイドとドキュメントについては、GitHubページをチェックすることをお勧めします。

上記のプロジェクトのコードに興味がある場合は、このgithubページをご覧ください。

結論

phpunitを使用して、すでにオブジェクトをmockすることができます。ただし、上記の例で説明したように、mockeryを使用することもできます。クラスをユニットテストしていて、他のクラスにテストに影響を与えたくない場合、ock笑は簡単に役立ちます。本当に機能的なテストを行いたい場合は、実際のテストを統合できるかどうかを確認する方が良いでしょう。現在、PHPunitシミュレーションを使用しており、ock笑への切り替えを検討していますか?後続の投稿で、より大きなock笑の例を見たいですか?以下のコメントで教えてください。

ock笑とテスト依存関係(FAQ)

に関するFAQ

ock笑とは何ですか?なぜPHPテストで重要なのですか?

ockeryは、単体テストのための強力で柔軟なPHPモックオブジェクトフレームワークです。 PhpunitのMockオブジェクト機能の直接的な代替品として設計されています。 mockeryを使用すると、開発者はテスト済みのコードを隔離し、複雑なオブジェクトの動作をシミュレートするテストスタンドインを作成できます。これは、テストされているコードが外部要因や状態に依存しないことを保証するため、単体テストで重要です。

私のPHPプロジェクトにockeryをインストールしてセットアップする方法は?

ockeryをインストールするには、PHP依存関係マネージャーであるComposerが必要です。コマンドを実行してockeryをインストールできます

。インストール後、テスト断片にcomposer require --dev mockery/mockeryを呼び出してモックオブジェクトをクリーンアップすることにより、テストファイルにockeryをセットアップできます。 Mockery::close()

mockeryを使用してモックオブジェクトを作成する方法は?

ock笑で模擬オブジェクトを作成するのは簡単です。

メソッドを使用して、モックオブジェクトを作成できます。たとえば、mock()はMyClass用のモックオブジェクトを作成します。 $mock = Mockery::mock('MyClass');

ock笑の期待を定義する方法は?

mockeryでは、メソッドをオブジェクトをmockにリンクすることにより、期待を定義します。たとえば、このコードは、「mymethod」が一度呼び出され、「mocked値」を返すことを期待するmockeryに伝えます。 $mock->shouldReceive('myMethod')->once()->andReturn('mocked value');

ock笑のシミュレーションとスタブの違いは何ですか?

ock笑では、モックは目的のものを設定できるオブジェクトであり、スタブは事前にプログラムされた応答を持つ模擬オブジェクトです。応答が唯一の重要なものである場合、スタブが通常使用され、相互作用自体をテストするときに模擬が使用されます。

プライベートな方法をテストするためにock笑を使用する方法は?

カプセル化の原則に違反するため、プライベートメソッドを直接テストすることはお勧めしません。ただし、必要に応じて、mockeryの

メソッドを使用して、模擬保護されたプライベートメソッドを可能にすることができます。 shouldAllowMockingProtectedMethods()

mockeryのコンストラクターパラメーターを処理する方法は?

シミュレートしたいクラスに、引数が付いたコンストラクターがある場合、それらを

メソッドに配列として渡すことができます。たとえば、mock()は$ arg1と$ arg2をMyClassのコンストラクターに渡します。 $mock = Mockery::mock('MyClass', [$arg1, $arg2]);

静的メソッドをシミュレートするためにock笑を使用する方法は?

mockeryは、

プレフィックスを使用して静的メソッドをシミュレートする方法を提供します。たとえば、alias:は、myclassの静的方法の目的の設定を設定するために使用できる模擬オブジェクトを作成します。 $mock = Mockery::mock('alias:MyClass');

すべての期待がock笑で満たされていることを確認する方法は?

テスト分解方法で

メソッドを使用して、すべての期待が満たされていることを確認できます。期待が満たされない場合、ock笑は例外を投げかけます。 Mockery::close()

ock笑の例外を処理する方法は?

メソッドを使用して、モックオブジェクトを設定して例外をスローできます。たとえば、「mymethod」が呼び出された場合、andThrow()は例外をスローします。 $mock->shouldReceive('myMethod')->andThrow(new Exception);

以上がモッケリーでテスト依存関係をock笑しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

PHP 8.1の列挙(列挙)とは何ですか? PHP 8.1の列挙(列挙)とは何ですか? Apr 03, 2025 am 12:05 AM

php8.1の列挙関数は、指定された定数を定義することにより、コードの明確さとタイプの安全性を高めます。 1)列挙は、整数、文字列、またはオブジェクトであり、コードの読みやすさとタイプの安全性を向上させることができます。 2)列挙はクラスに基づいており、トラバーサルや反射などのオブジェクト指向の機能をサポートします。 3)列挙を比較と割り当てに使用して、タイプの安全性を確保できます。 4)列挙は、複雑なロジックを実装するためのメソッドの追加をサポートします。 5)厳密なタイプのチェックとエラー処理は、一般的なエラーを回避できます。 6)列挙は魔法の価値を低下させ、保守性を向上させますが、パフォーマンスの最適化に注意してください。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

See all articles