2016-07-06 38 views
1

沒有發現我有以下項目結構作曲家PSR-4級的PHPUnit在同一目錄

src/ 
    ├─ MyPackage/ 
       ├─ MySDK.php 
       └─ SDKHelper.php 
test/ 
    ├─ MySDKTest.php 
    └─ TestUtils.php 
composer.json 
composer.lock 

我composer.json文件看起來像這樣:

"autoload": { 
    "psr-4": { 
     "MyPackage\\": "src/MyPackage" 
    } 
} 

一切工作很大,MySDKTest.php單元測試通過,直到我嘗試添加一些實用方法到第三個文件,TestUtils.php。當我嘗試從MySDKTest.php撥打TestUtils::utilityMethod()時,phpunit抱怨找不到類TestUtils

我一直在閱讀有關添加自動加載開發密鑰,我試過的變體,但迄今爲止,似乎沒有任何工作。我應該澄清,我可以在MySDKTest內使用MySDKSDKHelper方法。 MySDKTest.php看起來是這樣的,當它的工作原理:

use MyPackage\MySDK; 

class MySDKTest extends PHPUnit_Framework_TestCase { 

    public function testPackage() { 
     $sdk = new MySDK(); 
     $sdk->exampleMethod(); 
    } 
} 
+0

對於一個很好的問題,你應該總是提到究竟你試過了,沒有工作。這將使您更容易發現您的錯誤。不要寫*我一直在閱讀關於添加一個自動加載開發密鑰,我嘗試過*的變體,至少顯示了一個你認爲應該完成這個工作的例子。同時顯示無法加載的代碼,而不是已經工作的代碼,即我們需要'TestUtils.php'內容,而不是'MySDKTest.php'。 – Sven

+0

嗨@Sven,我忘了這個問題。事實證明,我確實做的都對。運行'composer.phar install'再次生成一個更新的autoload.php,它解決了這個問題。我將添加我使用的'autoload-dev'配置。 – arik

回答

1

它應該是非常簡單的。 Composer的PSR-4自動加載器只是定義了從命名空間到文件夾的映射。

您的測試命名空間是否正確?看起來他們沒有,因爲你的測試課上有use。如果MySDK位於名稱空間MyPackage(完全限定MyPackage\MySDK)中,我希望MySDKTest也位於MyPackage命名空間MyPackage\MySDKTest。它不一定是這樣的 - 如果你願意,你可以把測試放在不同的命名空間中。

無論如何,它沒有工作的原因是你沒有註冊自動加載器的測試文件夾。它看起來像你的東西正在建立的方式,磁帶自動加載機的配置應該是這樣的:

{ 
    "autoload": { 
     "psr-4": { "MyPackage\\": ["src/MyPackage/", "test/"] } 
    } 
} 

而且你需要在你的測試類改變use MyPackage\MySDK;namespace MyPackage;


注意

你的文件夾結構是有點怪異。我期望test匹配src。因此,這將是這樣的:

test/ 
    ├─ MyPackage/ 
     ├─ MySDK.php 
     └─ SDKHelper.php 

作出相應的調整命名空間:

{ 
    "autoload": { 
     "psr-4": { "MyPackage\\": ["src/MyPackage", "test/MyPackage"] } 
    } 
} 
+0

'autoload-dev'的作用是將測試代碼與生產代碼分開,因此不需要將包含'test'的路徑混合到'autoload'中。 – Sven