2013-07-01 14 views
14

私は常に\PHPUnit_Framework_TestCaseのサブクラスに混合しなければならない形質を持っています。 PhpStormはこれを知らない。 PhpStormにautocompleteを与え、特性内にassertNullのようなものを「型チェック」するために私ができることはありますか?形質でのPhpStormの自動補完

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

私は、これまで各メソッドに次入れている思い付くことが最高:

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

しかし、これは反復的で、保護されたmemebersを理解していません。より良い選択肢がありますか?

+3

ATMではありません - http://youtrack.jetbrains.com/issue/WI-16368(または同様のもの:http://youtrack.jetbrains.com/issues/WI?q=trait) – LazyOne

+0

あなたはsoloutionを見つけましたか?まだですか? '/ ** @var \ PHPUnit_Framework_TestCase | MyTestUtils $ this */ 'は私にとってはうまくいかない。 –

答えて

4

私はこれがPHP特性の有効なユースケースではないと主張します。 PHPUnit_Framework_TestCaseを拡張したクラスでのみ使用することが保証されているわけではありません。これは非常に密接に結合されたコードを導入する。特性のベストプラクティスは、それらが非常に疎結合されており、自分の内容のみを認識することです。

私の代わりに、あなたのいずれかのことをお勧めします:

  1. この機能が必要なテストケースが
  2. は、カスタムアサーションクラスを作成する拡張できること\ PHPUnit_Framework_TestCaseをのサブクラスを作成します。これらは、カスタムアサーションのグループを行うために何度も使用することができます。

両方の技術は、ここで詳述されている:http://phpunit.de/manual/4.1/en/extending-phpunit.html

これらの2つは、このようなヘルパーメソッドを配置する場所のためのベストプラクティスを推奨しています。

+2

私は密接に結合した形質は、このようなシナリオでは完全に合理的だと思います。 (ほとんど)動的な言語では、われわれは抽象概念のユーザをとにかく導くためにドキュメントに依存しなければならない(ほとんど)。スーパークラスは、単一の継承のために任意に構成するのが難しいという問題があります。あなたがアサーションをしたいときは、カスタムアサーションクラスはうまくいきますが、これは1つの特殊なケースです。 – mpartel

6

$thisを文書化するためにも、間違いなくとにかくあなたの形質は、より「安全」になり私の知る唯一の他の方法は、PHPののdocblockを使ってほかに、例えば、特性自体に抽象メソッドを定義することである。

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; 
    } 
} 
+3

あなたの答えは最高です。このようにして、形質メソッド内に存在する強い依存関係を宣言します。 –

+0

これはすばらしいことですが、クライアントは自分の特性依存性を明示的に知っています –

5

UPDATE:特性における自動補完はすぐに動作します PhpStorm 2016年1月2日(145.1616を構築する)ので。どのクラスがその特性を使用しているのかを把握し、次に自動補完を提供するのは賢明です。問題へのリンク:特性自体ののdocblockに...

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

、しかし欠点は、あなたが必要があるだろうということです:あなたが使用することができます

https://youtrack.jetbrains.com/issue/WI-16368

は以前と答えオートコンプリートしたいメソッドごとに@methodを入れてください。これは、あなたの特性に無理な数のメソッド呼び出しを使用している場合にはそれほど悪くありません。または、最も頻繁に使用しているメソッドだけを「文書化」します。

+1

'@ method' docblockに関するドキュメントhttps://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html – fyrye