PHP单元测试来自不同类的外部静态方法调用

标签 php unit-testing testing phpunit

我正在尝试为一个函数编写单元测试,该函数立即从另一个类中加载一个对象,该类使用函数的输入作为参数。我是 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/

相关文章:

"private"函数的 C 单元测试模拟

android - 无法在android上运行robotium单元测试应用程序

testing - 如何让管理层相信 QA 很重要?

php - 如何获取 php/laravel 数组中元素的位置

php - 从PHP5中的抽象方法访问类常量

用于比较两个具有约 300,000 个条目和输出差异的大型文本文件的 PHP 代码

php - 如何使用 Laravel 测试授权重定向?

c# - 如何使用 FluentAssertions 编写 CustomAssertion?

reactjs - 如何在 jest 中模拟一个 react 组件属性,它是另一个类的实例?

javascript - 我可以将 Angular 2 引入现有的 JS/jQuery/PHP 项目吗?