【发布时间】:2014-09-05 14:26:06
【问题描述】:
我遇到的问题是,当我尝试调用 getSiteFromHost 或 getAlternateSiteFromHost 方法时,存储库模拟类返回 null。创建模拟时我一定做错了什么,但我看不到它。
你们能发现什么吗?
这是我正在测试的类(服务):
class SiteHelper {
private $container;
private $em;
private $request;
public function __construct($entityManager, $container, $requestStack) {
$this->em = $entityManager;
$this->container = $container;
$this->request = $requestStack->getCurrentRequest();
}
public function getCurrentSiteHost() {
return $this->request->getHttpHost();
}
public function getCurrentSiteObj() {
$site = $this->em->getRepository('****')
->getSiteFromHost($this->getCurrentSiteHost());
return $site[0];
}
public function getAlternateSiteObj() {
$site = $this->em->getRepository('****')
->getAlternateSiteFromHost($this->getCurrentSiteHost());
return $site;
}
}
这里是测试类:
class SiteHelperTest extends \PHPUnit_Framework_TestCase {
private $siteHelper;
public function __construct() {
$em = $this->buildMockEntityManager();
$container = null;
$requestStack = $this->buildMockRequestStack();
$this->siteHelper = new SiteHelper($em, $container, $requestStack);
}
public function testCurrentSiteHost()
{
// assert that it's returning what it should be
$this->assertEquals($this->siteHelper->getCurrentSiteHost(), '****');
}
public function testCurrentSiteObj()
{
$this->assertEquals($this->siteHelper->getCurrentSiteObj()->getName(), '****');
}
public function testAlternateSiteObj()
{
$this->assertEquals($this->siteHelper->getAlternateSiteObj()->getName(), '****');
}
private function buildMockEntityManager() {
$site = $this->getMock('\****\Bundle\MainBundle\Entity\Site');
$site->expects($this->once())
->method('getName')
->will($this->returnValue('****'));
$altSite = $this->getMock('\****\Bundle\MainBundle\Entity\Site');
$altSite->expects($this->once())
->method('getName')
->will($this->returnValue('****'));
$siteRepository = $this->getMockBuilder('\Doctrine\ORM\EntityRepository')
->disableOriginalConstructor()
->getMock();
$siteRepository->expects($this->once())
->method('getSiteFromHost')
->will($this->returnValue(array(0 => $site)));
$siteRepository->expects($this->once())
->method('getAlternateSiteFromHost')
->will($this->returnValue($altSite));
$entityManager = $this->getMockBuilder('\Doctrine\Common\Persistence\ObjectManager')
->disableOriginalConstructor()
->getMock();
$entityManager->expects($this->once())
->method('getRepository')
->will($this->returnValue($siteRepository));
return $entityManager;
}
private function buildMockRequestStack() {
$request = $this->getMockBuilder('\Symfony\Component\HttpFoundation\Request')
->disableOriginalConstructor()
->getMock();
$request->expects($this->once())
->method('getHttpHost')
->will($this->returnValue('medicare.localhost'));
$requestStack = $this->getMockBuilder('\Symfony\Component\HttpFoundation\RequestStack')
->disableOriginalConstructor()
->getMock();
$requestStack->expects($this->once())
->method('getCurrentRequest')
->will($this->returnValue($request));
return $requestStack;
}
}
【问题讨论】:
-
也许
$entityManager->expects($this->once())应该是:$entityManager->expects($this->any())? -
不,仍然会出现同样的错误。还是)感谢你的建议。一次与任何的意义何在?
-
别再介意一次与任何一次 - 想通了。
-
如果该方法应该被调用一次,则调用一次
标签: php unit-testing symfony mocking