PhpUnit10已使非静态测试提供程序不再受欢迎.这使得在提供程序中创建双重测试成为问题,因为像createMock()
或createStub()
这样的方法不是静态的.以下是一个证明这个问题的假测试:
public function provideFake(): array
{
$someDate = $this->createMock(\DateTime::class);
$someOtherDate = $this->createMock(\DateTime::class);
return [
'first test' => [$someDate],
'second test' => [$someOtherDate],
];
}
/**
* @dataProvider provideFake
*/
public function testFake(\DateTime $date): void
{
self::assertTrue(true);
}
在PhpUnit10/PHP8.2中运行此测试,输出:
有1个PHPUnit弃用:数据提供程序方法ProvideFake()不是静态的
如果我将提供程序更改为静态,结果显然会更糟:
出现1个PHPUnit错误:为testFake指定的数据提供程序无效.在不在对象上下文中时使用$This
我可以在测试本身内而不是在提供程序内创建双重测试.在这个简单的例子中,它没有太大变化,因为我的替身只是没有固定行为的假人.
但在现实生活测试中,可能需要许多参数来定义这种行为.这意味着提供程序必须输出所有这些参数,而不是只输出一个对象,并且测试方法必须具有非常长的签名才能接受它们.
在我看来,这大大降低了代码的可读性.
有没有办法让静态提供程序创建测试替身?