誰もがこれを行っているわけではありませんが、アプリケーションをテストすることは、開発者であることの最も基本的な部分の1つです。ユニットテストは最も一般的なテストです。ユニットテストを使用すると、クラスが期待どおりに実行されているかどうかを確認できます。時には、アプリケーションでサードパーティサービスを使用している場合があり、ユニットテストのためにすべてをセットアップすることは困難です。これは、シミュレーションが機能するときです。
キーポイント
オブジェクトをock笑することは、単体テストで実際のオブジェクトを置き換える代替オブジェクトを作成することにすぎません。アプリケーションが依存関係の注入に大きく依存している場合、モッキングは実行可能な方法です。
オブジェクトをock笑する理由はいくつかあるかもしれません:
ユニットテストを実行するときにphpunitを使用している場合があります。 Phpunitには、ドキュメントに示すように、いくつかのデフォルトシミュレーション機能が付属しています。 Jeune Asuncionが書いたこの記事では、PHPunitのシミュレーションとシミュレーション機能の詳細について詳しく説明できます。
この記事では、PádraicBradyによって作成された図書館のock笑に飛び込みます。現在存在しない気象サービスを注入する温度クラスを作成します。設定
また、
<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構成ファイルも作成します
<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)
最後に、
、andReturn()
、andReturnNull()
などの返品方法もあります。それがあなたが期待するものであれば、ockeryは例外を投げることもできます。 andReturnSelf()
andReturnUndefined()
温度サービスオブジェクトを作成し、通常どおりにテストできるモックオブジェクトがあります。摂氏25度は華氏77度です。そのため、
getTempFahrenheit()
ルートディレクトリで
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()
上記のプロジェクトのコードに興味がある場合は、このgithubページをご覧ください。
結論
ock笑とテスト依存関係(FAQ)
私のPHPプロジェクトにockeryをインストールしてセットアップする方法は?
。インストール後、テスト断片にcomposer require --dev mockery/mockery
を呼び出してモックオブジェクトをクリーンアップすることにより、テストファイルにockeryをセットアップできます。 Mockery::close()
メソッドを使用して、モックオブジェクトを作成できます。たとえば、mock()
はMyClass用のモックオブジェクトを作成します。 $mock = Mockery::mock('MyClass');
mockeryでは、メソッドをオブジェクトをmockにリンクすることにより、期待を定義します。たとえば、このコードは、「mymethod」が一度呼び出され、「mocked値」を返すことを期待するmockeryに伝えます。 $mock->shouldReceive('myMethod')->once()->andReturn('mocked value');
プライベートな方法をテストするためにock笑を使用する方法は?
メソッドを使用して、模擬保護されたプライベートメソッドを可能にすることができます。 shouldAllowMockingProtectedMethods()
メソッドに配列として渡すことができます。たとえば、mock()
は$ arg1と$ arg2をMyClassのコンストラクターに渡します。 $mock = Mockery::mock('MyClass', [$arg1, $arg2]);
プレフィックスを使用して静的メソッドをシミュレートする方法を提供します。たとえば、alias:
は、myclassの静的方法の目的の設定を設定するために使用できる模擬オブジェクトを作成します。 $mock = Mockery::mock('alias:MyClass');
メソッドを使用して、すべての期待が満たされていることを確認できます。期待が満たされない場合、ock笑は例外を投げかけます。 Mockery::close()
メソッドを使用して、モックオブジェクトを設定して例外をスローできます。たとえば、「mymethod」が呼び出された場合、andThrow()
は例外をスローします。 $mock->shouldReceive('myMethod')->andThrow(new Exception);
以上がモッケリーでテスト依存関係をock笑しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。