您可以像对任何其他课程一样使用测试替身来模拟它,请参阅https://phpunit.de/manual/current/en/test-doubles.html
这可能是一个示例测试:
class TargetClass
{
public function testMeSomehow($id, Flag $flag)
{
return $flag->method1();
}
}
class TargetClassTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$mock = $this->getMock('Flag');
$mock->expects($this->once())
->method('method1')
->willReturn('methodResult');
$targetClass = new TargetClass();
$this->assertEquals('methodResult', $classToTest->testMeSomehow(1, $mock));
}
}
您可以将要被 mock 替换的方法指定为 $this->getMock() 的第二个参数。因为我们根本没有指定任何东西,所以它将替换所有方法,因此不会打扰抽象方法。
编辑:添加了一个访问常量的示例:
class ClassToTest
{
public function testMeSomehow($id, Flag $flag)
{
return $flag::NAME;
}
}
class FlagTest extends PHPUnit_Framework_TestCase
{
public function testStuff()
{
$mock = $this->getMock('Flag');
$classToTest = new ClassToTest();
$this->assertEquals('Flag name', $classToTest->testMeSomehow(1, $mock));
}
}
如果您想在测试中为该常量指定一个特定值,我建议使用该常量创建一个子类并将其用于模拟。
编辑:添加了一个示例,其中包含指定动态常量值的解决方法。
class Flag
{
const NAME = 'Flag name';
public function getName()
{
return static::NAME;
}
}
class TargetClass
{
public function testMeSomehow($id, Flag $flag)
{
return $flag->getName();
}
}
class TargetClassTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$mock = $this->getMock('Flag');
$mock->expects($this->any())
->method('getName')
->willReturn('New flag name');
$targetClass = new TargetClass();
$this->assertEquals('New flag name', $classToTest->testMeSomehow(1, $mock));
}
}
但是,这迫使您在任何地方都使用getName() 方法,所以我个人更喜欢前面的建议:模拟具有更改值的子类。