ZF2 phpunit Zend Logger

时间:2016-05-06 20:28:02

标签: php zend-framework2 phpunit

我正在尝试为我的应用程序编写单元测试。这是记录信息功能的。

首先,我有一个名为LogInfo的服务,这个我的类看起来像

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记录器并将其传递给上课。

1 个答案:

答案 0 :(得分:0)

让我们先看看你的一些代码,从实际的测试类ProcessorTest开始。这个类构造了一个new ServiceManager()。这意味着您将不得不在每个测试类中执行此操作,这样效率不高(DRY)。我建议像标题Zend Framework 2 documentation中描述的Bootstrapping your tests那样构建ServiceMananger。以下代码是我们感兴趣的方法。

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

使用此方法可以获得ServiceManagerBootstrap::getServiceManager()的实例。让我们使用这种方法重构测试类。

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()询问ServiceManager服务'Processor\Service\LogInfo'但您的测试类没有在任何地方设置此实例。确保在测试类中设置此服务,如下例所示。

$this->serviceManager->setService('Processor\Service\LogInfo', $processor);