2013-07-01 3 views
14

Ho un tratto che deve sempre essere miscelato in una sottoclasse di \PHPUnit_Framework_TestCase. PhpStorm non lo sa. C'è qualcosa che posso fare per ottenere il completamento automatico di PhpStorm e "tipografare" cose come assertNull all'interno del tratto?Completamento automatico di PhpStorm nei tratti

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

il meglio che potevo venire con finora sta mettendo quanto segue in ogni metodo:

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

Ma questo è ripetitivo e non capisce memebers protette. C'è un'opzione migliore?

+3

Non ATM - http://youtrack.jetbrains.com/issue/WI-16368 (o simile: http://youtrack.jetbrains.com/issues/WI?q=trait) – LazyOne

+0

Hai trovato una solitaria ancora? '/ ** @var \ PHPUnit_Framework_TestCase | MyTestUtils $ this */ ' non funziona per me. –

risposta

4

Direi che questo non è un caso d'uso valido per un tratto PHP. Il tuo tratto, come scritto non è garantito per essere utilizzato solo su classi che estendono \ PHPUnit_Framework_TestCase. Questo introduce un codice molto strettamente accoppiato. La migliore pratica dei Tratti è che siano accoppiati molto liberamente e siano solo consapevoli dei propri contenuti.

vorrei invece consigliare che si sia:

  1. creare una sottoclasse di \ PHPUnit_Framework_TestCase che i casi di test che hanno bisogno di questa funzionalità può estendere
  2. creare classi affermazione personalizzate. Questi possono essere usati molte volte per fare gruppi di asserzioni personalizzate.

Entrambe le tecniche sono dettagliate qui: http://phpunit.de/manual/4.1/en/extending-phpunit.html

Questi sono i due raccomandato migliori pratiche per dove posizionare i metodi helper come questi.

+2

Penso che i tratti strettamente accoppiati siano del tutto ragionevoli in scenari come questo. In un linguaggio (per lo più) dinamico, dobbiamo (soprattutto) fare affidamento sulla documentazione per guidare comunque gli utenti delle nostre astrazioni. Le superclassi hanno il problema di essere difficili da comporre arbitrariamente a causa dell'eredità singola.Le classi di asserzioni personalizzate vanno bene quando vuoi fare asserzioni, ma questo è solo un caso speciale. – mpartel

6

Oltre a utilizzare il docblock php per documentare $this, l'unico altro modo io sappia, che ha anche, rende senza dubbio il vostro tratto più "sicura" in ogni caso, è quello di definire metodi astratti sul tratto in sé, ad esempio:

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

La tua risposta è fantastica. In questo modo dichiari una forte dipendenza che esiste all'interno dei metodi dei tratti. –

+0

È fantastico, ora il client conosce esplicitamente le mie dipendenze trait –

5

UPDATE: Dal PhpStorm 2016/01/02 (build 145.1616) il completamento automatico in tratti funziona out-of-the-box. È abbastanza intelligente da capire quali classi usano il tratto e quindi fornire il completamento automatico. Collegamento alla questione: https://youtrack.jetbrains.com/issue/WI-16368

Precedentemente ha risposto con:

È possibile utilizzare:

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

... in docblock del carattere in sé, ma il lato negativo è che si avrebbe bisogno inserire @method per ogni metodo per il quale si desidera eseguire il completamento automatico, il che non è un problema se si utilizza un numero ragionevole di chiamate di metodo nel tratto. Oppure, "documenta" solo i metodi che usi più spesso.

+1

Documentazione sul docblock '@ method' https://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html – fyrye