如何解決PHP單元測試中訪問私有成員的問題?使用WikimediaTestingAccessWrapper庫可以!

可以通過以下地址學習composer學習地址

在進行php單元測試時,常常會遇到一個棘手的問題:如何訪問類中的私有屬性和方法?這些非公共元素的存在是為了封裝數據和行為,但它們也給測試帶來了一定的挑戰。通常,我們需要通過反射(Reflection)來繞過這些限制,但這種方法既復雜又容易出錯。就在我苦于尋找一個更簡便的方法時,我發現了Wikimedia Testing Access Wrapper庫。

Wikimedia Testing Access Wrapper是一個專為單元測試設計的輔助類,它通過簡化反射操作,讓我們可以輕松訪問非公共的屬性和方法。這個庫最初是MediaWiki的一部分,但現在已經獨立出來,供所有PHP開發者使用。

使用composer安裝Wikimedia Testing Access Wrapper非常簡單:

composer require wikimedia/testing-access-wrapper

讓我們來看一個使用示例:

立即學習PHP免費學習筆記(深入)”;

use WikimediaTestingAccessWrapper;  class NonPublic {     protected $prop;     protected const CONSTANT = 4;     protected function func() {}     protected static function staticFunc() {} }  class NonPublicCtor {     protected function __construct() {} }  $Object = new NonPublic(); // 或: // $object = TestingAccessWrapper::construct( NonPublicCtor::class );  $wrapper = TestingAccessWrapper::newFromObject( $object ); $classWrapper = TestingAccessWrapper::newFromClass( NonPublic::class );  $wrapper->prop = 'foo'; $wrapper->func(); $classWrapper->staticFunc();  $value = TestingAccessWrapper::constant( NonPublic::class, 'CONSTANT' );

這個庫提供了幾種方便的方法:

  • newFromObject($object):創建一個包裝器,允許訪問對象的非公共成員。
  • newFromClass($className):創建一個包裝器,允許訪問類靜態成員。
  • construct($className, …$args):創建一個類的實例,即使構造函數是受保護或私有的。
  • constant($className, $name):獲取類的常量值。

使用Wikimedia Testing Access Wrapper庫后,我的單元測試變得更加簡潔和高效。我不再需要編寫復雜的反射代碼,只需幾行簡單的調用就能訪問到需要測試的非公共元素。

總的來說,Wikimedia Testing Access Wrapper庫不僅簡化了單元測試的編寫過程,還提高了測試的覆蓋率和準確性。如果你在PHP單元測試中也遇到了類似的困擾,不妨試試這個庫,它一定會讓你大吃一驚的!

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享