![](/img/trans.png)
[英]Routing tests in ZF2 / ZF2 equivalent of Zend_Test_PHPUnit_Controller_TestCase?
[英]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.