【问题标题】:PhpStorm PHPUnit supportPhpStorm PHPUnit 支持
【发布时间】:2016-10-21 10:39:31
【问题描述】:
class MainTest extends TestCase
{
    public function testMain()
    {
        $stub = $this->createMock(Project\NotImplementedClass::class);

        $stub->method('doSomething')
            ->will($this->returnCallback(function ($string) {
                return strtoupper($string);
            }));

        $this->assertEquals('ABC', $stub->doSomething('abc'));
    } 
}

PhpStorm 告诉 doSomething 方法不存在。我搜索了任何可以自动完成方法的插件。有这个插件吗?

【问题讨论】:

  • 您希望在哪里定义doSomething?如果这只是您正在创建的“hello world”单元测试,为什么不自己定义一个方法并将其存根呢?

标签: phpunit phpstorm


【解决方案1】:

PHPStorm 的自动完成在很大程度上依赖于类型提示。在你的情况下 - 因为 $this->createMock() 将返回一个 PHPUnit_Framework_MockObject_MockObject 它没有它会抱怨的方法。

你可以做的是“覆盖”变量的类型提示:

/** @var Project\NotImplementedClass|PHPUnit_Framework_MockObject_MockObject $stub */
$stub = $this->createMock(Project\NotImplementedClass::class);

或者您可以将模拟创建放在具有类似@return docblock 的方法中。

这将告诉 PHPStorm 查看两个类以进行自动完成。

【讨论】:

    【解决方案2】:

    我们使用Dynamic Return Type-plugin 来改进PHPUnit 的类型提示。它并不完美,但易于设置和使用。该插件允许您根据参数的值定义方法的返回类型。

    将文件dynamicReturnTypeMeta.json添加到项目的根目录,内容如下:

    {
        "methodCalls": [
            {
                "class": "\\PHPUnit_Framework_TestCase",
                "method": "createMock",
                "position": 0,
                "mask": "%s|PHPUnit_Framework_MockObject_MockObject"
            }
        ],
        "functionCalls": []
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2013-11-02
      • 2018-03-24
      • 2011-07-25
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2016-01-20
      相关资源
      最近更新 更多