18

我有一个必须始终混入\PHPUnit_Framework_TestCase. PhpStorm 不知道这一点。我能做些什么来让 PhpStorm 自动完成和“类型检查”assertNull特性内部的东西吗?

<?php
trait MyTestUtils
{
    public function foo()
    {
        $this->assertNu // autocomplete?
    }
}

到目前为止,我能想到的最好的方法是在每种方法中添加以下内容:

/** @var \PHPUnit_Framework_TestCase|MyTestUtils $this */

但这是重复的,不理解受保护的成员。有更好的选择吗?

4

3 回答 3

10

除了使用 php docblock 来记录之外$this,我所知道的唯一另一种方法,也可以说无论如何使您的 trait 更加“安全”,就是在 trait 本身上定义抽象方法,例如:

 trait F {

    /**
     * @return string[]
     */
    abstract public function Foo();

    /**
     * @return self
     */
    abstract public function Bar();
}

abstract class Bar {
    use F;

    /**
     * @return bool|string[]
     */
    public function Baz () {
        if ($this->Bar()) {
            return $this->Foo();
        }

        return false;
    }
}
于 2015-11-10T13:18:47.787 回答
8

更新:自 PhpStorm 2016.1.2 (build 145.1616) 以来,traits 中的自动完成功能开箱即用。找出哪些类使用该特征,然后提供自动补全功能是足够聪明的。问题链接:https ://youtrack.jetbrains.com/issue/WI-16368

之前回复过:

您可以使用:

@method \PHPUnit_Framework_TestCase assertTrue($condition, $message = '')

...在特征本身的 docblock 中,但缺点是您需要@method为每个想要自动完成的方法放置,如果您使用的是合理数量的方法调用,这还不错在你的特质中。或者,仅“记录”您最常使用的那些方法。

于 2015-12-02T20:16:46.903 回答
5

我认为这不是 PHP 特征的有效用例。您所写的特征不能保证仅用于扩展 \PHPUnit_Framework_TestCase 的类。这引入了非常紧密耦合的代码。Traits 的最佳实践是让它们非常松散耦合,并且只知道它们自己的内容。

相反,我建议您:

  1. 创建一个 \PHPUnit_Framework_TestCase 的子类,您需要此功能的测试用例可以扩展
  2. 创建自定义断言类。这些可以多次用于执行自定义断言组。

这两种技术都在这里详细介绍:http: //phpunit.de/manual/4.1/en/extending-phpunit.html

这是两个推荐的最佳实践,用于放置这些辅助方法的位置。

于 2014-07-08T19:00:05.790 回答