我正在尝试为一个函数编写单元测试,该函数立即从另一个类中加载一个对象,该类使用函数的输入作为参数。我是 php 单元测试的新手,找不到任何解决我的特定问题的方法。我有一些导致无济于事的线索是使用注入(inject)器,并试图向我们反射(reflect)。
我尝试为其编写单元测试的代码是:
public static function isUseful($item) {
$objPromo = MyPromoCodes::Load($item->SavedSku);
if (!is_null($objPromo)
&& ($objPromo->PromoType == MyPromoCodes::Interesting_Promo_Type)) {
return true;
}
return false;
}
我试图模拟这一点:
public function testIsUseful() {
$injector = $this->getMockBuilder('MyPromoCodes')
->setMethods(array('Load'))
->getMock();
$objPromo = $this->getMock('MyPromoCodes');
$objPromo->PromoType = 'very interesting promo type';
$injector->set($objPromo, 'MyPromoCodes');
$lineItem1 = $this->getDBMock('LineItem');
$this->assertTrue(MyClass::isUseful($lineItem1));
}
但是这不起作用,因为这个对象没有设置方法....
不确定还能尝试什么,如有任何帮助,我们将不胜感激。
最佳答案
我做了 the library这使得静态类模拟成为可能:
class MyClass {
public static $myPromoCodes = 'myPromoCodes';
public static function isUseful($item) {
$objPromo = self::$MyPromoCodes::Load($item->SavedSku);
if (!is_null($objPromo)
&& ($objPromo->PromoType == MyPromoCodes::Interesting_Promo_Type)) {
return true;
}
return false;
}
}
class MyClassTest extends \PHPUnit_Framework_TestCase
{
public function testSomething()
{
$myClass = Moka::stubClass('MyClass');
$myClass::$myPromoCodes = Moka::stubClass(null, ['::Load' => (object)[
'PromoType' => MyPromoCodes::Interesting_Promo_Type
]]);
$this->assertTrue($myClass::isUseful((object)['SavedSku' => 'SKU']);
$this->assertEquals([['SKU']], $myClass::$myPromoCodes->moka->report('::Load'));
}
}
关于PHP单元测试来自不同类的外部静态方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558436/