繁体   English   中英

ZF2 phpunit Zend Logger

[英]ZF2 phpunit Zend Logger

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

首先,我有一个名为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并使用它并在文件中写入信息。

现在我需要为类Processor编写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致命错误:在一个非对象上调用成员函数info()

我不确定,我怎么能模仿Zend记录器并将其传递给课堂。

让我们先看看你的一些代码,从实际的测试类ProcessorTest 该类构造一个new ServiceManager() 这意味着您将不得不在每个测试类中执行此操作,这是无效的( DRY )。 我建议构建ServiceMananger就像标题引导你的测试中Zend Framework 2文档所描述的那样。 以下代码是我们感兴趣的方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM