预言 - 期望不会在对象上调用任何方法
Prophecy - Expect that no method will be called on an object
现在我在 PHPUnit 中使用以下代码来期望在 mock 上没有调用任何方法:
$object = $this->createMock(ClassA:class);
$object->expects($this->never())->method($this->anything());
到目前为止,我还没有找到在 Prophecy 中实现相同结果的方法。到目前为止,我只能测试特定方法的假设,而不是上面示例中的所有方法。
目前我正在使用以下自定义断言来测试是否没有调用任何方法。 Prophecy 的 ObjectProphecy 公开了一种方法来获取对特定函数的所有调用,因此我使用反射来获取 class 上的所有方法,而不是每个方法的每次调用。如果之后调用数组为空,我就知道没有调用任何方法。该方法现在看起来像这样:
public function assertNoMethodHasBeenCalled(ObjectProphecy $prophecy, string $className)
{
$methods = get_class_methods($className);
$calls = [];
foreach ($methods as $method) {
$reflectionMethod = new \ReflectionMethod($className, $method);
$numArgs = count($reflectionMethod->getParameters());
$calls = array_merge(
$calls,
$prophecy->findProphecyMethodCalls(
$method,
new ArgumentsWildcard(array_fill(0, $numArgs, Argument::any()))
)
);
}
$this->assertEmpty($calls);
}
到目前为止,它对我有限的样本量有效,但我对此并不满意。我觉得应该有一种更简单的方法来实现相同的结果。
据我所知,用 Prophecy 实现这个并不简单。
Prophecy 在预期方面与 PHPUnit 的模拟不同。一旦你设置了一个期望,对你的模拟的每一次调用都不是预测或承诺,将无法通过测试。给定以下对象预言:
$prophecy = $this->prophesize(ClassA::class);
$prophecy->methodA()->shouldNotBeCalled();
$objectA = $prophecy->reveal();
两者都
$objectA->methodA();
和
$objectA->methodB();
将无法通过测试。
因此,当您没有设置任何期望时,您必须像以前一样手动检查来电。
现在我在 PHPUnit 中使用以下代码来期望在 mock 上没有调用任何方法:
$object = $this->createMock(ClassA:class);
$object->expects($this->never())->method($this->anything());
到目前为止,我还没有找到在 Prophecy 中实现相同结果的方法。到目前为止,我只能测试特定方法的假设,而不是上面示例中的所有方法。
目前我正在使用以下自定义断言来测试是否没有调用任何方法。 Prophecy 的 ObjectProphecy 公开了一种方法来获取对特定函数的所有调用,因此我使用反射来获取 class 上的所有方法,而不是每个方法的每次调用。如果之后调用数组为空,我就知道没有调用任何方法。该方法现在看起来像这样:
public function assertNoMethodHasBeenCalled(ObjectProphecy $prophecy, string $className)
{
$methods = get_class_methods($className);
$calls = [];
foreach ($methods as $method) {
$reflectionMethod = new \ReflectionMethod($className, $method);
$numArgs = count($reflectionMethod->getParameters());
$calls = array_merge(
$calls,
$prophecy->findProphecyMethodCalls(
$method,
new ArgumentsWildcard(array_fill(0, $numArgs, Argument::any()))
)
);
}
$this->assertEmpty($calls);
}
到目前为止,它对我有限的样本量有效,但我对此并不满意。我觉得应该有一种更简单的方法来实现相同的结果。
据我所知,用 Prophecy 实现这个并不简单。
Prophecy 在预期方面与 PHPUnit 的模拟不同。一旦你设置了一个期望,对你的模拟的每一次调用都不是预测或承诺,将无法通过测试。给定以下对象预言:
$prophecy = $this->prophesize(ClassA::class);
$prophecy->methodA()->shouldNotBeCalled();
$objectA = $prophecy->reveal();
两者都
$objectA->methodA();
和
$objectA->methodB();
将无法通过测试。
因此,当您没有设置任何期望时,您必须像以前一样手动检查来电。