如何创建学说实体的模拟对象?
我正在尝试使用 phpunit 为使用学说 2 的模型编写单元测试.我想模拟学说实体,但我真的不知道如何执行此操作.谁能向我解释我需要怎么做?我正在使用 Zend 框架.
I'm trying to write a unit test with phpunit for a model that uses doctrine 2. I want to mock the doctrine entities but I really don't have a clue of how to do this. Can anyone explain to me how I need to do this? I'm using Zend Framework.
需要测试的模型
class Country extends App_Model
{
public function findById($id)
{
try {
return $this->_em->find('EntitiesCountry', $id);
} catch (DoctrineORMORMException $e) {
return NULL;
}
}
public function findByIso($iso)
{
try {
return $this->_em->getRepository('EntitiesCountry')->findOneByIso($iso);
} catch (DoctrineORMORMException $e) {
return NULL;
}
}
}
Bootstrap.php
protected function _initDoctrine()
{
Some configuration of doctrine
...
// Create EntityManager
$em = EntityManager::create($connectionOptions, $dcConf);
Zend_Registry::set('EntityManager', $em);
}
扩展模型
class App_Model
{
// Doctrine 2.0 entity manager
protected $_em;
public function __construct()
{
$this->_em = Zend_Registry::get('EntityManager');
}
}
推荐答案
Doctrine 2 实体应该像任何旧类一样对待.您可以像 PHPUnit 中的任何其他对象一样模拟它们.
Doctrine 2 Entities should be treated like any old class. You can mock them just like any other object in PHPUnit.
$mockCountry = $this->getMock('Country');
从 PHPUnit 5.4 开始,getMock() 方法已被弃用.请改用 createMock() 或 getMockbuilder().
As of PHPUnit 5.4, the method getMock() has been depricated. Use createMock() or getMockbuilder() instead.
正如@beberlei 所指出的,您在 Entity 类本身中使用 EntityManager,这会产生许多棘手的问题,并且破坏了 Doctrine 2 的主要目的之一,即 Entity 不关心自己的持久性.这些查找"方法确实属于 存储库类.
As @beberlei noted, you are using the EntityManager inside the Entity class itself, which creates a number of sticky problems, and defeats one of the major purposes of Doctrine 2, which is that Entity's aren't concerned with their own persistance. Those 'find' methods really belong in a repository class.
相关文章