使用 Mockery 和 PHPUnit 模拟 class 的常量和方法

Mock a class's constant and method with Mockery and PHPUnit

Mockery 的新手...我正在测试一个 class(在我过度简化的乏味示例中的 Buzz),它调用另一个 class(Foo->getData) 的方法,我有一个mock 模拟这个方法,效果很好。现在我添加了对 class 常量 (Foo::FIZZ) 的检查,并且由于常量未定义,我的测试中断了。

我尝试通过映射常量来添加常量,如 Mockery Docs here 所示,但它仍然说常量 FOO\Bar::FIZZ 未定义。我一直无法找到任何其他方法来将常量设置为我的 Mockery 模拟。如有任何帮助,我们将不胜感激!

约束:由于模拟 class 中的一些 hard dependencies,我必须使用重载 Mockery。

namespace Foo; 

class Bar() {
  const FIZZ = 'hello';

  public function getData() {
    //retrieve $data from database
    return $data;
  }
}

class Buzz() {

  public function returnResult() {
    $result = Foo\Bar->getData();
    if ($result !== Foo\Bar::FIZZ) { // if result is different than my constant, return it
      return $result;
    }
    return false;
  }
}

在我的测试中:

use PHPUnit\Framework\TestCase;
use Mockery;
use Foo;

class BuzzTest extends TestCase {

   \Mockery::getConfiguration()->setConstantsMap([
    'Bar' => [
        'FIZZ' => 'hello',
    ]
  ]);

  public function testBuzzRejectsIfEqual(): void {

        $externalMock = \Mockery::mock('overload:\Foo\Bar')
            ->shouldReceive('getData')
            ->andReturn('hello');

        $obj = new \Foo\Buzz();
        $actual = $obj->returnResult();
        $this->assertEquals($actual, false);
  }
}

感谢这篇很棒的文章https://blog.gougousis.net/mocking-static-methods-with-mockery/我终于能够使用命名模拟完成这项工作。

use PHPUnit\Framework\TestCase;
use Mockery;
use Foo;

class BuzzTest extends TestCase {


  public function testBuzzRejectsIfEqual(): void {

        $externalMock = \Mockery::namedMock(Foo\Bar:class, BarStub::class)
            ->shouldReceive('getData')
            ->andReturn('hello');

        $obj = new \Foo\Buzz();
        $actual = $obj->returnResult();
        $this->assertEquals($actual, false);
  }
}

class BarStub {
  const FIZZ = 'hello';
}