PHP プロジェクトには、メインのシングルトンと、メインのシングルトンを使用する他のシングルトンがあります。
<?php
class SingletonMain
{
// Main singleton
// ...
}
class SingletonA
{
protected $main;
function __construct()
{
$main = SingletonMain::getInstance();
}
}
class SingletonB
{
protected $main;
function __construct()
{
$main = SingletonMain::getInstance();
}
}
?>
SingletonAとSingletonBでSingletonMainをモックする最も簡単な方法は、 SingletonMainインスタンスへの参照を取得してこれを実行することだと思いました。
- SingletonMainインスタンスを にコピーします
$temp
。 - SingletonMainの代わりにMockSingletonMainインスタンスを配置します。「その場で」とは、同じ参照場所で、SingletonAとSingletonBが新しいモックを元のSingletonMainであるかのようにすぐに使用できることを意味します。
- テスト。
- SingletonMainインスタンスを元の場所に戻し
$temp
ます。
それは可能ですか?そうでない場合、すべてのSingletonsABCDでSingletonMainをモックする最も簡単な方法は何ですか....
$this->main = $my_mock
現在、私の唯一の解決策は、これらのリーフシングルトンのそれぞれに新しいモックを明示的に設定し、最後に通常の代入演算子を使用して(およびテスト後に)もう一度元に戻すこと$this->main = SingletonMain::getInstance()
です。
編集
いくつかの回答を読んで、さらに情報を提供する必要があることに気付きました。私はこれらのリーフシングルトンを約20〜30個持っています。このアプリケーションは、そもそも数年前にテストするように設計されていなかったので、今は何も壊さず、できるだけ変更を加えずにシングルトン パターンを回避する最善の方法を探しています。