2012-10-23 33 views
7

我有一個Symfony2服務,它使用依賴注入的config.yml參數構造而成。我現在試圖對它進行單元測試,發現單元測試無法訪問容器以及服務。所以我應該使用模擬數據自己創建一個。如果我現在可以讀取配置參數(首先進入config_test.yml然後config.yml等等),但對我來說這是有道理的,但看起來也是不可能的。這似乎使單元測試服務繁瑣,因爲我需要將初始化參數編碼到測試中,而不是配置文件。Symfony2在單元測試中獲取配置參數

如果在單元測試中真的沒有辦法用config.yml中的參數構造一個服務,那麼有沒有人知道爲什麼它是Bad Thing™的邏輯?

回答

5

我發現這篇文章,因爲我自己需要在我的測試中的配置參數。這是Google上的第一次。

但是,這是一個可行的解決方案。可能會有更好的。

<?php 

... 

require_once(__DIR__ . "/../../../../../app/AppKernel.php"); 

class MediaImageTest extends WebTestCase 
{ 
    private $_application; 
    private $storagePath; 

    public function setUp() { 
     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $this->_application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
     $this->_application->setAutoExit(false) 

     $this->storagePath = $this->_application->getKernel()->getContainer()->getParameter('media_path'); 
    } 

    ... 
} 

你可能在看這個太:Access Symfony 2 container via Unit test? 是一個更清潔的解決方案訪問單元測試中的內核。

+3

$ container-> getParameter()是答案 –

2

單元測試是關於獨立於其他類測試一個類。要單元測試您的服務,您不需要從配置中讀取任何內容。只需在測試中傳遞一個值。最後,它可能會與其他值一起工作,對吧?

當然,如果圍繞接受的值有一些邏輯/驗證,您應該可以通過測試來覆蓋它。想想如果你從配置中獲取這個值,你會怎麼做。你根本無法用不同的值來測試行爲。

如果您想驗證您的應用程序是否正常工作(您的類以您期望的方式進行協作),請使用功能測試或驗收測試工具(如Behat)。

+0

我的服務需要從我們的測試服務器數據拉(我們在生產和測試模式的服務器)。我在這裏測試的是服務如何對從那裏得到的數據做出反應。它不是完全隔離的單元測試,但我已經驗證了從服務器發出的數據是正確的,而不是複製並保存服務器輸出並將其手動提供給我的服務,我想驗證服務是否可以獲得數據本身。 – Craig

+1

所以它不是單元測試。更多集成或系統測試。最簡單的事情是使用Symfony的功能測試(仍然是PHPUnit測試)。功能測試客戶端可以訪問容器(http://symfony.com/doc/2.0/book/testing.html#accessing-internal-objects)。如果你仍然想使用常規的單元測試類,請查看初始化單元測試中的容器:https://gist.github.com/1319290 –

+0

那麼,如何對下載文件的類進行「單元」測試?它會一直被視爲功能測試,因爲它到達了它自身之外? – Craig

8

這個工作對我來說:

class MyServiceTest extends WebTestCase 
{ 
    public function testCookies() 
    { 
     $client = static::createClient(); 

     $myParams = $client->getKernel()->getContainer()->getParameter('my_params'); 
    } 
} 
+1

,雖然我想知道是否有任何擴展單元測試WebTestCase的問題(因爲它通常用於功能測試) – timhc22

0
我使用的Symfony 3.2.2

,但我認爲這也爲你工作。

它只是一條線:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir');