为了账号安全,请及时绑定邮箱和手机立即绑定

预言 - 预计不会在对象上调用任何方法

预言 - 预计不会在对象上调用任何方法

PHP
慕勒3428872 2023-09-15 21:37:05
现在我在 PHPUnit 中使用以下代码来期望模拟上不会调用任何方法:$object = $this->createMock(ClassA:class);$object->expects($this->never())->method($this->anything());到目前为止我还没有找到在 Prophecy 中达到同样结果的方法。到目前为止,我只能测试特定方法的假设,而不能测试上面示例中的所有方法。目前,我正在使用以下自定义断言来测试是否未调用任何方法。Prophecy 的 ObjectProphecy 公开了一个方法来获取对特定函数的所有调用,因此我使用反射来获取类上的所有方法,而不是每个方法的每次调用。如果之后调用数组为空,我就知道没有调用任何方法。该方法现在如下所示: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);}到目前为止,它适用于我有限的样本量,但我对此并不满意。我觉得应该有一种更简单的方法来达到相同的结果。
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

据我所知,用预言来实现这一目标并不简单。


当涉及到期望时,Prophecy 的工作方式与 PHPUnit 的模拟不同。一旦您设置了期望,对模拟的每次调用(不是预测或承诺)都将无法通过测试。给出以下对象预言:


$prophecy = $this->prophesize(ClassA::class);

$prophecy->methodA()->shouldNotBeCalled();


$objectA = $prophecy->reveal();

两个都


$objectA->methodA();


$objectA->methodB();

将无法通过测试。


因此,当您没有设置任何期望时,您必须像以前一样手动检查呼叫。


查看完整回答
反对 回复 2023-09-15
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信