PHP7でのモンキーパッチ

Twifty

この4歳の質問は、私は少し怪しげな程度だサードパーティのライブラリを使用しています。

テストの目的でのみ、クラスの1つの静的メソッドを再定義したいと思います。次の例を見てください。

class Driver {
   public static function getVersion() : string
   {
        // Retrieves a version from a system executable
        return some_system_call();
   }
}

class Module {
   public function methodToTest()
   {
       if (Driver::getVersion() === '4.0.0') {
          // allow for additional options/methods
       } else {
          // use a subset
       }
   }
}

Driver::getVersion異なるバージョンの文字列を返す必要があります。私は通常クラスをモックしますが、これは注入もインスタンスもされていないため、機能しません。

私はクラスがテストされていることを呼び出す必要はありませんでしょう、メソッドとプロパティのテストに追加して、ソースを変更することができDriver、しかし、私の意見では、単にテストは「仕事」にするためにコードをリファクタリングすることは解決策ではありません。

私は別の作成の線に沿って考えているDriverクラスを何とか元の場所にそれをロードします。

これどうやってするの?

xmike

次のようなsmthを使用することをお勧めします。

class Module
{
   private $version;

   public function __construct($version){
      $this->version = $version;
   }

   public function methodToTest()
   {
       if ($this->version === '4.0.0') {
          // allow for additional options/methods
       } else {
          // use a subset
       }
   }
}

または別のオプションはありませんが、そのバージョンのプロバイダを(あなたがコントロールをバージョン管理するための複雑なロジックのいくつかのビットを持っていることがわかっている場合-あなたは間のロジックを分割することができるように注入されるだろうModuleし、Provider必要に応じて):

class Module
{
   private $versionProvider;

   public function __construct($provider){
      $this->versionProvdier = $provider;
   }

   public function methodToTest()
   {
       if ($this->versionProvider->getVersion() === '4.0.0') {
          // it could be even $this->versionProvider->newFeaturesAreSupported()
       } else {
          // some other stuff
       }
   }
}

さらに別の方法では、次のようなプロキシクラスを実装することもできます。

class Module
{
   public function methodToTest()
   {
       $myMonostateProxy = new MyMonostateProxy();
       $version = $myMonostateProxy->getVersion();
       if ($version === '4.0.0') {
          // allow for additional options/methods
       } else {
          // use a subset
       }
   }
}

あなたは、別途ごmonostateを模擬することができるように(おそらくprivtates上またはそのパブリックインターフェイスを介してreflectioningを経由して、とにかくすることを忘れないでくださいtearDownこと)。それの実際の実装は、それを制御不能と呼ぶだけDriver::getVersion()です。

私は(あなたが実行するために、いくつかの注入を必要とするよう)最初の2つのオプションがきれいだと思いますが、作成のためのいくつかの努力が必要です。3つ目は、その隠された依存関係を持っており、テストがやや難しいため、完全にクリーンではなく、維持するためにより多くの努力が必要ですが、通常の使用を容易にするために、選択したものをすべて隠します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

サードパーティクラスのPHPモンキーパッチ

分類Dev

npmパッケージレベルでのモンキーパッチ?

分類Dev

PHP7のパフォーマンス

分類Dev

関数の「オンライン」モンキーパッチ

分類Dev

eventlet.greenthread.sleepVSモンキーパッチ環境でのtime.sleep

分類Dev

モンキーパッチが機能しないのはなぜですか?

分類Dev

PHP7でのmoxiemanagerのエラー

分類Dev

独自のモンキーパッチでモンキーパッチを元に戻すAngularを回避するにはどうすればよいですか?

分類Dev

Pythonオーバーレイ:モンキーパッチの事例

分類Dev

EclipseでのPHP7デバッガー設定

分類Dev

Pythonのポン引き/モンキーパッチ

分類Dev

Golangモンキーパッチ

分類Dev

モンキーパッチActiveJobs

分類Dev

GRequestsモンキーパッチ警告

分類Dev

モンキーパッチJavaScriptnew Date()

分類Dev

$_SERVER['HOME'] の PHP7 バージョンは何ですか

分類Dev

ハンドルバー/ Symfonyでの口ひげ/ PHP7

分類Dev

PHP7でのTCPDFエラー

分類Dev

PHP7のデフォルトのパッケージ名は何ですか?

分類Dev

モンキーパッチとは何ですか?

分類Dev

Ruby onRailsでモンキーパッチを適用する方法

分類Dev

PHP7のスカラー型と厳密型はパフォーマンス向上機能ですか?

分類Dev

モンキーパッチまたはpytestのモックでライブラリを削除する方法は?

分類Dev

関数名前空間のモンキーパッチ

分類Dev

モンキーパッチPythonの構文解析

分類Dev

actioncontrollerのモンキーパッチunpermitted_parameters

分類Dev

モンキーパッチdjango機能の方法は?

分類Dev

Elixirでモジュール機能をモンキーパッチする方法

分類Dev

php7のzendセッションデータベースのエラー

Related 関連記事

  1. 1

    サードパーティクラスのPHPモンキーパッチ

  2. 2

    npmパッケージレベルでのモンキーパッチ?

  3. 3

    PHP7のパフォーマンス

  4. 4

    関数の「オンライン」モンキーパッチ

  5. 5

    eventlet.greenthread.sleepVSモンキーパッチ環境でのtime.sleep

  6. 6

    モンキーパッチが機能しないのはなぜですか?

  7. 7

    PHP7でのmoxiemanagerのエラー

  8. 8

    独自のモンキーパッチでモンキーパッチを元に戻すAngularを回避するにはどうすればよいですか?

  9. 9

    Pythonオーバーレイ:モンキーパッチの事例

  10. 10

    EclipseでのPHP7デバッガー設定

  11. 11

    Pythonのポン引き/モンキーパッチ

  12. 12

    Golangモンキーパッチ

  13. 13

    モンキーパッチActiveJobs

  14. 14

    GRequestsモンキーパッチ警告

  15. 15

    モンキーパッチJavaScriptnew Date()

  16. 16

    $_SERVER['HOME'] の PHP7 バージョンは何ですか

  17. 17

    ハンドルバー/ Symfonyでの口ひげ/ PHP7

  18. 18

    PHP7でのTCPDFエラー

  19. 19

    PHP7のデフォルトのパッケージ名は何ですか?

  20. 20

    モンキーパッチとは何ですか?

  21. 21

    Ruby onRailsでモンキーパッチを適用する方法

  22. 22

    PHP7のスカラー型と厳密型はパフォーマンス向上機能ですか?

  23. 23

    モンキーパッチまたはpytestのモックでライブラリを削除する方法は?

  24. 24

    関数名前空間のモンキーパッチ

  25. 25

    モンキーパッチPythonの構文解析

  26. 26

    actioncontrollerのモンキーパッチunpermitted_parameters

  27. 27

    モンキーパッチdjango機能の方法は?

  28. 28

    Elixirでモジュール機能をモンキーパッチする方法

  29. 29

    php7のzendセッションデータベースのエラー

ホットタグ

アーカイブ