#528·prophecy

RFC: 新的意外方法调用行为

作者: ciaranmcnulty创建于 2021年3月18日更新于 2023年1月13日

理由 #441 改变了行为,在当时看来是合理的,但却引发了性能问题。为了解决这个问题,似乎需要大幅度的版本升级,因此我们可以借此机会仔细思考行为,并确定下一个主要版本中最佳的方案。 # 历史背景 Prophecy 是一个具有主观性的工具,我们努力遵循的不是让测试变得简单,而是推动开发人员朝着正确的方向前进。在 PHP 5.3 时代,我们还没有返回类型。当时决定 Prophecy 将基本上具有两种模式: 1. 对于没有任何期望的对象,所有方法调用都返回 null 2. 对于具有期望的对象,意外的方法调用会立即抛出异常 ## 间谍问题 这导致了使用间谍并同时对方法进行替代时出现的问题,例如: $stub->foo()->willReturn('bar'); $this->bar($stub); $stub->baz()->shouldHaveBeenCalled(); 这就是 #441 实现的原因,但现在这意味着意外消息的调用栈被混乱了,并且 null 返回值被传递给其他方法,导致在意外调用错误显示之前出现了错误。 ## 返回类型问题 现代 PHP 已经到达了可以并应当为几乎所有方法添加返回类型的阶段。这使得回退行为变得不那么有用,因为在大多数情况下,这是一个类型错误。 # 新的行为 在新的主要版本中,Prophecy 双重值将默认情况下变得严格。 也就是说,即使没有设置期望,也会在调用时为任何意外的方法调用抛出异常,但有一个例外:返回 void 的方法。 这将允许对命令式方法使用间谍行为,只要 baz 示例返回 void: $stub->foo()->willReturn('bar'); $this->bar($stub); $stub->baz()->shouldHaveBeenCalled(); 这将禁止以前的 Dummy 类似的双重值使用。 ## BC 影响 没有为双重值指定返回值的测试将会失败,除非这些双重值只具有 void 方法调用。PhpSpec 和 PHPUnit 桥接依赖于 prophecy 1,因此可以选择何时向其用户展示此破坏性更改。

内容来源: phpspec/prophecy