【问题标题】:Get the base_url in Behat @BeforeSuite在 Behat @BeforeSuite 中获取 base_url
【发布时间】:2015-02-25 18:19:00
【问题描述】:

我正在使用 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() 访问参数,所以我可以在那里复制 url,但是有没有更简洁的解决方案。

【问题讨论】:

    标签: php behat mink


    【解决方案1】:

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

    protected static $databaseReady;
    
    /**
     * @BeforeScenario
     */
    public function setupDatabase()
    {
        if (!self::$databaseReady) {
    
            // Set it up…
    
            self::$databaseReady = true;
        }
    }
    

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

    【讨论】:

    【解决方案2】:

    这是一个肮脏的 hack,但如果你必须从 @BeforeSuite 钩子中完成它,你可以像这样得到它:

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

    【讨论】:

    • 这会阻止您多次输入@BeforeScenario。这两种方式都不是特别干净,但我都喜欢它们。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2011-04-16
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多