我正在尝试为我的应用程序编写单元测试。这是记录信息功能的。
首先,我有一个名为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记录器并将其传递给上课。
答案 0 :(得分:0)
让我们先看看你的一些代码,从实际的测试类ProcessorTest
开始。这个类构造了一个new ServiceManager()
。这意味着您将不得不在每个测试类中执行此操作,这样效率不高(DRY)。我建议像标题Zend Framework 2 documentation中描述的Bootstrapping your tests那样构建ServiceMananger
。以下代码是我们感兴趣的方法。
public static function getServiceManager()
{
return static::$serviceManager;
}
使用此方法可以获得ServiceManager
到Bootstrap::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);