2014-10-17 72 views
2

我正在使用Behat和Mink測試使用Laravel框架的應用程序,並且我想在運行測試之前使用Artisan設置數據庫。獲取Behat中的base_url @BeforeSuite

爲了正確配置Artisan,我需要知道將要測試的域,以及因此使用哪個Laravel環境。這在使用的各種配置文件下的behat.yml中列出。例如:

default: 
    extensions: 
     Behat\MinkExtension\Extension: 
      base_url: http://www.example.com 
      ... 
daniel: 
    extensions: 
     Behat\MinkExtension\Extension: 
      base_url: http://example.dev 

是否可以從@BeforeSuite獲取base_url的值?

這裏的主要問題似乎是@BeforeSuite必須是靜態的,因此無法訪問Mink,所以我不能只是$this->getMinkParameter('base_url')

我可以通過$suiteEvent->getContextParameters()訪問參數,所以我可以在那裏複製網址,但有沒有更清晰的解決方案。

回答

1

一些鉤子的工作方式真的讓我感到困惑。在實例化上下文之前不會傳遞參數,因此在實際創建之前沒有簡單的方法在上下文中獲取它們。做的最好的事情就是用@BeforeScenario事件與databaseReady標誌,這樣的事情:

protected static $databaseReady; 

/** 
* @BeforeScenario 
*/ 
public function setupDatabase() 
{ 
    if (!self::$databaseReady) { 

     // Set it up… 

     self::$databaseReady = true; 
    } 
} 

但我不知道它是如何在Laravel做,但大多數的框架有一個配置和引導,包括不同的環境。將這些東西放在那裏並使用引導腳本(可以從@BeforeSuite鉤子運行)創建環境(包括數據庫)是一個不錯的主意。

+1

這完美地工作。我不能把整個Artisan/Laravel的答案放在這裏,但對於任何有興趣的人來說,這將是這個答案和我以前對這個問題的回答的結合:http://stackoverflow.com/questions/24643449/laravel-4 -2-artisancall-ignoring-env-option/26425714#26425714 – DanielM 2014-10-17 14:09:22

+0

下面是一個可以大致顯示它如何工作的要點:https://gist.github.com/Gisleburt/62ce3507eb792c42dfae – DanielM 2014-10-17 14:20:55

1

這是一個骯髒的黑客,但如果你不得不從@BeforeSuite掛鉤做到這一點,你可以得到這樣的:

use Behat\Testwork\ServiceContainer\Configuration\ConfigurationLoader; 
$config = new ConfigurationLoader('BEHAT_PARAMS', getcwd() . '/behat.yml'))->loadConfiguration(); 
$baseUrl = $config[0]['extensions']['Behat\\MinkExtension']['base_url']; 
+0

這會阻止你進入@BeforeScenario多次。這兩種方式都不是特別乾淨,但我喜歡他們兩個。 :) – DanielM 2015-02-26 13:38:11