是否可以在PHPUnit中创建一个不存在的类的模拟?
假设我有一些类创建另一个类的实例,例如:
class TaskRunner
{
public function runTasks()
{
// Run through some loop to get tasks and store each in $taskName
// Get task instance by given task name
$task = $this->getTaskInstance($taskName);
if ($task instanceof AbstractTask) {
$task->run();
}
}
protected function getTaskInstance($taskName)
{
// Just an example
return new $taskName();
}
}
我想对runTasks
方法运行单元测试,以检查创建的任务实例是否扩展了一些抽象类。
是否有可能不在文件系统中创建样本类来检查继承约束?
谢谢大家!
答案 0 :(得分:31)
是的,可以存根/模拟PHPUnit不存在的类。只需执行$this->getMockBuilder('NameOfClass')->setMethods(array('foo'))->getMock();
即可创建一个不存在的类NameOfClass
的对象,该对象提供一种方法foo()
,可以像往常一样使用API进行配置。
答案 1 :(得分:0)
接受的答案是完美的,除了自 PHPUNIT 9 以来存在一个问题,如果您需要模拟需要属于某个实例的类。在这种情况下,不能使用 \stdclass::class
。
并使用
$this->getMockBuilder('UnexistentClass')->addMethods(['foo'])->getMock();
将导致 Class UnexistentClass does not exist
,因为 addMethod 根据给定的类方法检查给定的方法。
如果其他人有同样的问题,幸运的是 setMethods 仍然有效,所以这在 phpunit 9 中仍然有效
$this->getMockBuilder('UnexistentClass')->setMethods(['foo'])->getMock();
(注意 setMethods 将在 phpunit 10 中删除)
希望届时能解决此问题。例如检查allowMockingUnknownTypes 是否设置为true。如果实施了该检查,这也将起作用:
$this->getMockBuilder('UnexistentClass')->allowMockingUnknownTypes()
->addMethods(['foo'])->getMock();