ホームページ > バックエンド開発 > PHPチュートリアル > モッケリーでテスト依存関係をock笑します

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

William Shakespeare
リリース: 2025-02-20 09:07:09
オリジナル
145 人が閲覧しました

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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート