2013-07-01 58 views
14

我有一個特徵必須總是混合到\PHPUnit_Framework_TestCase的子類中。 PhpStorm不知道這一點。有什麼我可以做的,讓PhpStorm自動完成和「typecheck」的東西內特質assertNullPhpStorm在性狀上的自動完成

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

我能想出到目前爲止是把每個方法如下最好的:

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

但這是重複的,不明白的保護承包商,客人。有更好的選擇嗎?

+3

不是自動櫃員機 - 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的類。這引入了非常緊密耦合的代碼。 Traits的最佳實踐是讓他們非常鬆散地聯繫在一起,只知道他們自己的內容。

我反而建議您:

  1. 創建\ PHPUnit_Framework_TestCase中的一個子類,需要此功能測試用例可以擴展
  2. 創建自定義斷言類。這些可以多次用於執行自定義斷言組。

這兩種技術都在這裏詳細介紹:http://phpunit.de/manual/4.1/en/extending-phpunit.html

這是兩個推薦用於放置輔助方法,如這些最佳做法。

+2

我認爲緊密耦合的特質在這種情況下是完全合理的。在(大部分)動態語言中,我們必須(主要)依靠文檔來指導抽象的用戶。超類有單一繼承難以任意組合的問題。自定義斷言類在你想斷言時很好,但這只是一個特例。 – mpartel

6

除了使用PHP的docblock記錄$this,唯一的另一種方式我所知道的,這也可以說是讓你的特質更「安全」反正就是對自身特質,如定義抽象方法:

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)自動完成的作品特質外的開箱。足夠聰明地弄清楚哪些類使用這些特徵,然後提供自動完成。鏈接到問題:https://youtrack.jetbrains.com/issue/WI-16368

以前用的回答是:

您可以使用:

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

...在他們的特性本身的文檔塊,但缺點是,你需要將@method用於您希望自動完成的每種方法,如果您在特質中使用了一些正常的方法調用,則這並不算太壞。或者,僅「記錄」最常用的那些方法。

+1

關於「@ method」docblock的文檔https://www.phpdoc.org/docs/latest/references/phpdoc/tags/method.html – fyrye

相關問題