在Behat @BeforeSuite中获取base_url

时间:2014-10-17 12:45:41

标签: php behat mink

我使用Behat和Mink使用Laravel框架测试应用程序,我想在运行测试之前使用Artisan来设置数据库。

为了正确配置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()访问参数,因此我可以在那里复制网址,但是有更清晰的解决方案。

2 个答案:

答案 0 :(得分:1)

一些钩子的工作方式真的让我很烦恼。在实例化上下文之前不会传递参数,因此在实际创建上下文之前,没有干净或简单的方法将它们放入上下文中。最好的办法是使用带有@BeforeScenario标志的databaseReady事件,类似:

protected static $databaseReady;

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

        // Set it up…

        self::$databaseReady = true;
    }
}

但后来我不知道它是如何在Laravel中完成的,但大多数框架都有配置和引导程序,包括不同的环境。保留这些内容并使用引导脚本(可以从@BeforeSuite钩子运行)来设置环境,包括数据库,这是一个好主意。

答案 1 :(得分: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'];