2016-05-06 4 views
1

私のアプリケーションの単体テストを書こうとしています。これは情報の機能をログとして記録します。私はたLogInfoと呼ばれるサービス、私はデータを処理する別のクラスを持っているZF2 phpunit Zend Logger

use Zend\Log\Logger; 
class LogInfo { 
$logger = new Logger; 
return $logger; 
} 

のように、この方法を私のクラスの外観を持っていると

を開始します。これは以下の通りです。ここ

class Processor 
{ 
    public $log; 

    public function processData($file) 
    { 
     $this->log = $this->getLoggerObj('data'); 
     $this->log->info("Received File"); 
    } 
    public function getLoggerObj($logType) 
    { 
     return $this->getServiceLocator()->get('Processor\Service\LogInfo')->logger($logType); 
    } 
} 

私はLOGINFOサービスを呼び出し、それを使用して、ファイル内の情報を書いています。私はそれを実行しよう

今私はクラスプロセッサ

以下

用のPHPUnitを作成する必要がありますが

class ProcessorTest{ 
    public function setUp() { 
    $mockLog = $this->getMockBuilder('FileProcessor\Service\LogInfo', array('logger'))->disableOriginalConstructor()->getMock(); 
    $mockLogger = $this->getMockBuilder('Zend\Log\Logger', array('info'))->disableOriginalConstructor()->getMock(); 

    $serviceManager = new ServiceManager(); 
     $serviceManager->setService('FileProcessor\Service\LogInfo', $mockLog); 
     $serviceManager->setService('Zend\Log\Logger', $mockLogger); 

     $this->fileProcessor = new Processor(); 
     $this->fileProcessor->setServiceLocator($serviceManager); 
    } 

    public function testProcess() { 
     $data = 'I have data here'; 
     $this->fileProcessor->processData($data); 
    } 
} 

私のユニットテストケースで、私は「エラーを取得しています..... .PHP致命的なエラー: "

私はZend loggerをどうやって模擬してクラスに渡すことができますか?

+0

'getLoggerObj'関数の' get( 'Processor \ Service \ LogInfo')の呼び出しがテストケース中にあなたに戻ってきているかどうか調べてみましたか? – Fge

答えて

0

実際のテストクラスProcessorTestから始めて、いくつかのコードをチェックアウトしてみましょう。このクラスはnew ServiceManager()を構築します。つまり、すべてのテストクラスでこれを行う必要がありますが、これは効率的ではありません(DRY)。私はZend Framework 2 documentationのようなServiceManangerを建設して、Bootstrapping your testsの見出しに記載することを提案します。次のコードは、我々が興味のある方法である。このアプローチを使用して

public static function getServiceManager() 
{ 
    return static::$serviceManager; 
} 

Bootstrap::getServiceManager()を通してServiceManagerのインスタンスを得ることができます。このメソッドを使用して、リファクタリングすることができます。

class ProcessorTest 
{ 
    protected $serviceManager; 
    protected $fileProcessor; 

    public function setUp() 
    { 
     $this->serviceManager = Bootstrap::getServiceManager(); 
     $this->serviceManager->setAllowOverride(true); 
     $fileProcessor = new Processor(); 
     $fileProcessor->setServiceLocator($this->serviceManager); 
     $this->fileProcessor = $fileProcessor; 
    } 

    public function testProcess() 
    { 
     $mockLog = $this->getMockBuilder('FileProcessor\Service\LogInfo', array('logger')) 
      ->disableOriginalConstructor() 
      ->getMock(); 
     $mockLogger = $this->getMockBuilder('Zend\Log\Logger', array('info')) 
      ->disableOriginalConstructor() 
      ->getMock(); 

     $serviceManager->setService('FileProcessor\Service\LogInfo', $mockLog); 
     $serviceManager->setService('Zend\Log\Logger', $mockLogger); 

     $data = 'I have data here'; 
     $this->fileProcessor->processData($data); 
    } 
} 

この方法では、テスト関数ごとにモックオブジェクトの期待値を変更することもできます。 ProcessorインスタンスはProcessorTest::setUp()で作成されますが、この場合は可能です。

これはどのような方法でもまだあなたの問題を解決していません。私はProcessor::getLoggerObj()のサービス'Processor\Service\LogInfo'のためにServiceManagerを尋ねますが、テストクラスはこのインスタンスをどこにも設定しません。次の例のように、テストクラスでこのサービスを設定してください。

$this->serviceManager->setService('Processor\Service\LogInfo', $processor); 
関連する問題