この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
クラスを何とか元の場所にそれをロードします。
これどうやってするの?
次のような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]
コメントを追加