2013-07-01 8 views
14

Ich habe eine Eigenschaft, die immer in eine Unterklasse von \PHPUnit_Framework_TestCase gemischt werden muss. PhpStorm weiß das nicht. Gibt es irgendetwas, was ich tun kann, um PhpStorm zur automatischen Vervollständigung zu bringen und Dinge wie assertNull in das Merkmal einzutippen?PhpStorm Autokomplettierung in Merkmalen

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

Das Beste, was ich bisher mit so kommen konnte folgendes in jeder Methode setzt:

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

Aber das ist repetitiv und versteht nicht geschützt memebers. Gibt es eine bessere Option?

+3

Nicht ATM - http://youtrack.jetbrains.com/issue/WI-16368 (oder ähnlich: http://youtrack.jetbrains.com/issues/WI?q=trait) – LazyOne

+0

Haben Sie eine Lösung gefunden? noch? '/ ** @var \ PHPUnit_Framework_TestCase | MyTestUtils $ this */ ' funktioniert nicht für mich. –

Antwort

4

Ich würde argumentieren, dass dies kein gültiger Anwendungsfall für ein PHP-Merkmal ist. Es ist nicht garantiert, dass Ihre Eigenschaft, wie geschrieben, nur für Klassen verwendet wird, die \ PHPUnit_Framework_TestCase erweitern. Dies führt zu sehr eng gekoppeltem Code. Die beste Praxis von Traits ist, dass sie sehr lose miteinander verbunden sind und nur ihre eigenen Inhalte kennen.

würde ich stattdessen empfehlen, dass Sie entweder:

  1. eine Unterklasse von \ PHPUnit_Framework_TestCase schaffen, dass Ihre Testfälle, die diese Funktionalität benötigen erweitern können
  2. Klassen individuelle Behauptung erstellen. Diese können häufig verwendet werden, um benutzerdefinierte Assertionsgruppen auszuführen.

Beide Techniken sind hier aufgeführt: http://phpunit.de/manual/4.1/en/extending-phpunit.html

Dies sind die beiden für bewährte Verfahren empfohlen, bei denen Hilfsmethoden wie diese zu stellen.

+2

Ich denke, eng gekoppelte Eigenschaften sind in solchen Szenarien durchaus sinnvoll. In einer (meist) dynamischen Sprache müssen wir uns (meistens) auf Dokumentation stützen, um die Benutzer unserer Abstraktionen auf jeden Fall zu führen. Superklassen haben das Problem, aufgrund einer einzelnen Vererbung willkürlich zu komponieren.Benutzerdefinierte Assertion-Klassen sind in Ordnung, wenn Sie Assertionen ausführen möchten, aber das ist nur ein spezieller Fall. – mpartel

6

die PHP Docblock Neben der Verwendung von $this, die einzige andere Art und Weise zu dokumentieren, ich bin mir dessen bewusst, was auch wohl Ihr Merkmal „sicher“ auf jeden Fall mehr macht, ist die abstrakte Methoden auf das Merkmal zu definieren selbst, zB:

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

Ihre Antwort ist großartig. Auf diese Weise deklarieren Sie eine starke Abhängigkeit, die in Merkmalsmethoden existiert. –

+0

Das ist genial, jetzt kennt der Client explizit meine Eigenschaften Abhängigkeiten –

5

UPDATE: Seit PhpStorm 2016.01.02 (Build 145.1616) Auto-Vervollständigung in Zügen arbeitet out-of-the-box. Es ist schlau genug, um herauszufinden, welche Klassen das Merkmal verwenden, und dann die Autovervollständigung bereitzustellen. Link zum Thema: https://youtrack.jetbrains.com/issue/WI-16368

Zuvor antwortete mit:

Sie verwenden können:

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

... in Docblock des Merkmals selbst, aber der Nachteil ist, dass Sie bräuchten Setzen Sie @method für jede Methode, für die Sie eine automatische Vervollständigung haben möchten, was nicht schlecht ist, wenn Sie eine vernünftige Anzahl von Methodenaufrufen in Ihrem Merkmal verwenden. Oder "dokumentieren" Sie nur die Methoden, die Sie am häufigsten verwenden.

+1

Dokumentation auf dem '@ method' docblock https://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html – fyrye