加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

嘲弄 – 模拟类:方法暗示

发布时间:2020-12-13 16:58:09 所属栏目:PHP教程 来源:网络整理
导读:我有以下设置:我用 PHPUnit模拟非抽象类,但不是所有的方法.因此,非模拟方法仍然存在于模拟中对实际方法的调用. 问题是:如何暗示这些方法是可用的(当然,有正确的签名)? 我会详细说明一下.课程样本: class RealClass{ public function callApi(Api $api) {
我有以下设置:我用 PHPUnit模拟非抽象类,但不是所有的方法.因此,非模拟方法仍然存在于模拟中对实际方法的调用.

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

我会详细说明一下.课程样本:

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玩一下但是无法解决这个问题.此外,理想的解决方案是允许在返回语句中指定提示的解决方案,因为我可能希望从测试帮助程序方法返回模拟.

“廉价作弊”是暗示原始的类,但我不想做,从那时起我将失去重点 – 这是嘲笑,哪些不是.这尤其重要,因为我正在使用帮助器来构建注入模拟的复杂实体.

解决方法

你应该将mock暗示为MockObject或RealClass的一个实例,所以你会得到类似的东西:

/** @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']);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读