2014-10-17 2 views
2

Я использую Behat и Mink для тестирования приложения с использованием рамки Laravel, и я хочу использовать Artisan для настройки базы данных перед запуском тестов.Получить base_url в Behat @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 

Возможно ли получить значение base_url из @BeforeSuite?

Основная проблема здесь заключается в том, что @BeforeSuite должен быть статическим и, следовательно, не имеет доступа к норке, поэтому я не могу просто $this->getMinkParameter('base_url').

Я могу получить доступ к параметрам с помощью $suiteEvent->getContextParameters(), поэтому я мог бы дублировать URL-адрес, но есть ли более чистое решение.

ответ

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

+0

Вот сущность, показывающая, как это работает, когда вы все вместе: https://gist.github.com/Gisleburt/62ce3507eb792c42dfae – DanielM

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