我正在尝试为一个函数编写一个单元测试,该函数立即从另一个类中加载一个对象,该类使用该函数的输入作为参数。我是php单元测试的新手,无法找到解决我特定问题的任何东西。我所拥有的一些导致无用的是使用注射器,并尝试反射。
我正在尝试编写单元测试的代码是:
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));
}
但是这不起作用,因为此对象没有set方法....
不确定还有什么可以尝试,任何帮助将不胜感激。
答案 0 :(得分:1)
我使the library使静态类模拟成为可能:
[B = (1/2)*sqrt(2), C = (1/2)*sqrt(2), c = 45]
答案 1 :(得分:0)
首先,您不能使用PHPUnit模拟静态方法。至少不是4.x和5.x。
我建议像这样的DI方法:
class MyClass
{
private $promoCodesRepository;
public function __construct(MyPromoCodesRepository $promoCodesRepository)
{
$this->promoCodesRepository = $promoCodesRepository;
}
public function isUseful(MyItem $item)
{
$objPromo = $this->promoCodesRepository->Load($item->SavedSku);
// ...
}
}
在这里,您可以轻松模拟Load方法。
不幸的是,“静态”方法在测试期间会产生很多问题,因此最好尽可能避免使用它。