gpt4 book ai didi

PHPUnit:现有对象的模拟方法

转载 作者:IT王子 更新时间:2023-10-29 00:12:08 24 4
gpt4 key购买 nike

PHPUnit 的 getMock($classname, $mockmethods) 根据给定的类名创建一个新对象,并让我更改/测试我指定的方法的行为。

我渴望不一样的东西;它正在改变现有对象方法的行为 - 无需构建新对象。

这可能吗?如果是,如何?


在考虑这个问题时,我得出的结论是,可以通过序列化对象、更改序列化字符串以使对象成为扩展旧类的新类的实例以及被 mock 的方法。我想要一些代码 - 或者也许某处已经有这样的代码。


虽然肯定可以再次创建要模拟的对象,但在我的测试中这样做太复杂了。因此,如果我真的不是真的必须这样做,我不想这样做。这是一个 TYPO3 TSFE 实例,在引导过程中设置一次就已经很困难了。

最佳答案

我知道这个答案已经很晚了,但我觉得对于这个问题的 future 观众来说,现在有一个更简单的解决方案(它有一些缺点,但根据您的需要可以更容易实现)。 Mockery支持使用他们所谓的 "proxied partial mock." 模拟预先存在的对象他们说这是针对具有 final 方法的类,但它可以用于这种情况(尽管文档警告说它应该是“最后的手段”)。

$existingObjectMock = \Mockery::mock($existingObject);
$existingObjectMock->shouldReceive('someAction')->andReturn('foobar');

它的作用是创建一个代理对象,将所有方法调用和属性获取/设置传递给现有对象,除非它们被模拟。

不过,应该注意的是,代理存在任何类型检查或类型提示失败的明显问题。但这通常可以避免,因为 $existingObject 仍然可以传递。您应该只在需要模拟功能时使用 $existingObjectMock

关于PHPUnit:现有对象的模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com