特定のファイルの拡張子に基づいてライター戦略を返す Factory クラスがあります。
public static function getWriterForFile($file)
{
// create file info object
$fileInfo = new \SplFileInfo($file);
// check that an extension is present
if ('' === $extension = $fileInfo->getExtension()) {
throw new \RuntimeException(
'No extension found in target file: ' . $file
);
}
// build a class name using the file extension
$className = 'MyNamespace\Writer\Strategy\\'
. ucfirst(strtolower($extension))
. 'Writer';
// attempt to get an instance of the class
if (!in_array($className, get_declared_classes())) {
throw new \RuntimeException(
'No writer could be found for the extension: ' . $extension
);
}
$instance = new $className();
$instance->setTargetFile($file);
return $instance;
}
私の戦略はすべて同じインターフェースを実装しています。たとえば、次のようになります。
class CsvWriter implements WriterStrategyInterface
{
public function setTargetFile($file)
{
...
}
public function writeLine(array $data)
{
...
}
public function flush()
{
...
}
}
テストが既存の特定の戦略に依存しないように、ダミーの拡張機能を使用してこのメソッドをテストできるようにしたいと考えています。クラス名を設定してインターフェイスのモックを作成しようとしましたが、これはモック クラス名を宣言していないようです。
public function testExpectedWriterStrategyReturned()
{
$mockWriter = $this->getMock(
'MyNamespace\Writer\Strategy\WriterStrategyInterface',
array(),
array(),
'SssWriter'
);
$file = 'extension.sss';
$writer = MyNamespace\Writer\WriterFactory::getWriterForFile($file);
$this->assertInstanceOf('MyNamespace\Writer\Strategy\WriterStrategyInterface', $writer);;
}
ファクトリをロードするためのモック ライター戦略をステージングする方法はありますか、またはファクトリ メソッドをリファクタリングしてテストしやすくする必要がありますか?