为什么 Mockery return demeter_getMyClass 而不是 MyClass?
Why does Mockery return demeter_getMyClass instead of MyClass?
我尝试模拟多个方法调用。如前所述 in the documentation,测试以下方法调用:
$object->foo()->bar()->zebra()->alpha()->selfDestruct();
我们可以使用下面这段代码:
$mock = \Mockery::mock('CaptainsConsole');
$mock->shouldReceive('foo->bar->zebra->alpha->selfDestruct')->andReturn('Ten!');
所以,我实现了它:
public function testProcessPayment()
{
$offerPayment = m::mock('MyApp\Model\Entity\OfferPayment');
$paymentTransaction = m::mock('MyApp\Model\Entity\PaymentTransaction');
$paymentTransaction->shouldReceive('getOfferPayment->getOffer')->andReturn($offerPayment);
$transactionManager = new TransactionManager();
$transactionManager->processPayment($paymentTransaction);
$this->assertInstanceOf('Offer', $paymentTransaction->getOfferPayment()->getOffer());
}
相关class:
class TransactionManager
{
public function processPayment(PaymentTransaction $paymentTransaction) {
$itemGroupEntity = $paymentTransaction->getOfferPayment()->getOffer();
}
}
我得到:
Return value of Mockery_3_MyApp_Model_Entity_PaymentTransaction::getOfferPayment() must be an instance of MyApp\Model\Entity\OfferPayment, instance of Mockery_4__demeter_getOfferPayment returned
getOfferPayment 和 getOffer 的实现:
public function getOfferPayment() : OfferPayment
{
return $this->offerPayment;
}
public function getOffer() : Offer
{
return $this->offer;
}
在这种情况下,Mockery 不支持return type declarations。
这个问题可以通过 删除 return getter 的类型声明 来解决:
public function getOfferPayment()
{
return $this->offerPayment;
}
public function getOffer()
{
return $this->offer;
}
我尝试模拟多个方法调用。如前所述 in the documentation,测试以下方法调用:
$object->foo()->bar()->zebra()->alpha()->selfDestruct();
我们可以使用下面这段代码:
$mock = \Mockery::mock('CaptainsConsole');
$mock->shouldReceive('foo->bar->zebra->alpha->selfDestruct')->andReturn('Ten!');
所以,我实现了它:
public function testProcessPayment()
{
$offerPayment = m::mock('MyApp\Model\Entity\OfferPayment');
$paymentTransaction = m::mock('MyApp\Model\Entity\PaymentTransaction');
$paymentTransaction->shouldReceive('getOfferPayment->getOffer')->andReturn($offerPayment);
$transactionManager = new TransactionManager();
$transactionManager->processPayment($paymentTransaction);
$this->assertInstanceOf('Offer', $paymentTransaction->getOfferPayment()->getOffer());
}
相关class:
class TransactionManager
{
public function processPayment(PaymentTransaction $paymentTransaction) {
$itemGroupEntity = $paymentTransaction->getOfferPayment()->getOffer();
}
}
我得到:
Return value of Mockery_3_MyApp_Model_Entity_PaymentTransaction::getOfferPayment() must be an instance of MyApp\Model\Entity\OfferPayment, instance of Mockery_4__demeter_getOfferPayment returned
getOfferPayment 和 getOffer 的实现:
public function getOfferPayment() : OfferPayment
{
return $this->offerPayment;
}
public function getOffer() : Offer
{
return $this->offer;
}
在这种情况下,Mockery 不支持return type declarations。 这个问题可以通过 删除 return getter 的类型声明 来解决:
public function getOfferPayment()
{
return $this->offerPayment;
}
public function getOffer()
{
return $this->offer;
}