gpt4 book ai didi

mocking - 模拟类 : methods hinting

转载 作者:行者123 更新时间:2023-12-02 11:18:17 28 4
gpt4 key购买 nike

我有以下设置:我正在使用 PHPUnit 模拟非抽象类,但不是它的所有方法。因此,非模拟方法仍然作为对模拟中真实方法的调用而存在。

问题是:如何暗示这些方法可用(当然,具有正确的签名)?

我会详细说明一下。类(class)样本:

class RealClass
{
public function callApi(Api $api) {}

public function doStuff(Foo $foo, Bar $bar) {}
}

现在我在测试中这样做:

/** @var  \PHPUnit_Framework_MockObject_MockObject $mock */
$mock = $this->getMock('\RealClass', ['callApi']);

这将为 callApi() 创建模拟,但如果在测试中我这样做:

$mock->doStuff($foo, $bar);

我的 PHPStorm 显然找不到该方法,并认为这是一个错误。我如何指出 doStuff() 方法存在并且需要正确的参数?

@method 似乎仅在类定义内工作。我尝试使用 @see 但无法解决问题。另外,理想的解决方案是允许在 return 语句中指定提示,因为我可能想从测试助手方法返回模拟。

“便宜的作弊”是对原始类的暗示,但我不想这样做,从那时起我就会失去重点 - 哪个是模拟,哪个不是。这一点尤其重要,因为我使用助手来构建注入(inject)模拟的复杂实体。

最佳答案

您应该将模拟提示为 MockObjectRealClass 的实例,这样您就会得到类似以下内容的内容:

/** @var \RealClass|\PHPUnit_Framework_MockObject_MockObject $mock */
$mock = $this->getMock('\RealClass', ['callApi']);

现在您告诉 PhpStorm $mock 可以是 PHPUnit MockObject RealClass 实例并且它将接受/自动完成来自任一类的方法。

此外(这只是一个友好的建议,完全没有必要),您可以使用 use 关键字将类导入到您的测试类中,这样您的提示就可以变得更多可读:

<?php

use \RealClass;
use \PHPUnit_Framework_MockObject_MockObject as MockObject;

class YourTestClass
{
public function yourTest()
{
// Because of the use statements (and the "as" alias rule) you can now:
/** @var RealClass|MockObject $mock */
$mock = $this->getMock('RealClass', ['callApi']);
}
}

关于mocking - 模拟类 : methods hinting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32711338/

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