2016-09-13 43 views
1

我有一個傳統項目,它使用「自動加載」定義中的「文件」部分進行一些初始化。這個初始化取決於一些框架。我想要做的是讓這個代碼庫的少量單元測試可以運行,而不需要框架出現。我的遺留項目的代碼通過「autoload」中的「psr-4」和「classmap」組合加載。此外,這個項目依賴於通過Composer加載的一些庫。使用不包含文件的Composer自動加載器

這意味着我不能像我通常那樣在自己的測試引導中包含作曲家自動加載器(vendor/autoload.php)。我已經在包括vendor/composer中的類圖,命名空間和psr-4加載器,儘管在Composer代碼中進行了一些挖掘後發現並不那麼簡單。

使用Composer生成的自動加載器時是否有一種比較有道理的方式,而不包含「自動加載」部分中定義的「文件」?

+0

您可以簡單地從'vendor/composer /'文件夾加載'autoload_classmap.php'?我的意思是猜測可以工作。或者你需要的任何文件。 – Andrew

+0

並不那麼簡單。這些文件實際上並沒有加載任何東西,它們只是返回應該加載的規範。我當然可以將這些註冊到Composer自動加載類,儘管我希望有一個更好的方法。 –

+0

傳統項目是否有過不錯的方法?不要回答這個問題,反問題。你可以註冊一個spl自動加載器?至少它有沒有實際加載類直到他們需要的好處,但作曲家又是如此...... – Andrew

回答

0

雖然不是一個很好的解決方案,但您可以自己創建一個Composer自動加載器的實例,並自己註冊psr-4,classmap和psr-0定義。

假設測試的引導是在你的項目根目錄的子目錄,下面的代碼應該工作:

require __DIR__ . '/../vendor/composer/ClassLoader.php'; 

call_user_func(function() { 
    $loader = new \Composer\Autoload\ClassLoader(); 

    foreach (require __DIR__ . '/../vendor/composer/autoload_namespaces.php' as $namespace => $path) { 
     $loader->set($namespace, $path); 
    } 

    foreach (require __DIR__ . '/../vendor/composer/autoload_psr4.php' as $namespace => $path) { 
     $loader->setPsr4($namespace, $path); 
    } 

    $classMap = require __DIR__ . '/../vendor/composer/autoload_classmap.php'; 

    if ($classMap) { 
     $loader->addClassMap($classMap); 
    } 

    $loader->register(true); 
}); 

這不會利用從作曲自動加載「靜態變量初始化」的代碼路徑。據我所知,這只是爲了優化目的,所以這不應該成爲測試的問題。

相關問題