在@BeforeSuite中配置Mink / Behat base_url

时间:2013-12-26 19:46:43

标签: behat mink

为了避免端口冲突,我在可用端口上的@BeforeSuite事件中启动Web服务器。

注意:要查找可用端口:

    $socket = stream_socket_server("tcp://$host:0");
    $address = stream_socket_get_name($socket, false);
    fclose($socket);
    list($host, $port) = explode(':', address);

一旦我有了端口#I,我就开始php -S $address -t $document_root作为异步进程(使用Symfony\Component\Process\Process),我想要直到套接字打开。

这非常有效,但是,我不知道如何告诉Mink扩展使用http://$host:$port/作为base_url

有可能吗?

- 编辑

我的尝试:

    global $app;

    $r = new \ReflectionClass('Symfony\Component\Console\Application');
    $p = $r->getProperty('runningCommand');
    $p->setAccessible(true);
    $runningCommand = $p->getValue($app);

    $r = new \ReflectionObject($runningCommand);
    $p = $r->getProperty('container');
    $p->setAccessible(true);

    $container = $p->getValue($runningCommand);
    $parameterBag = $container->getParameterBag();
    $r = new \ReflectionClass('Symfony\Component\DependencyInjection\ParameterBag\ParameterBag');
    $m = $r->getMethod('set');
    $m->invoke($parameterBag, 'behat.mink.base_url', "http://$address/");

    $minkContextInitializer = $container->getDefinitions()['behat.mink.context.initializer'];
    $arguments = $minkContextInitializer->getArguments();
    $arguments[1]['base_url'] = "http://$address/";
    $minkContextInitializer->setArguments($arguments);

    $minkContextInitializer = $container->getDefinitions()['behat.mink.listener.sessions_listener'];
    $arguments = $minkContextInitializer->getArguments();
    $arguments[1]['base_url'] = "http://$address/";
    $minkContextInitializer->setArguments($arguments);

mink扩展(在我的情况下是僵尸)仍在使用behat.yml中的base_url。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

这是一个解决方法,在app / behat中,我把:

#!/usr/bin/env php
<?php

require_once __DIR__.'/../vendor/autoload.php';

use NoPair\Test\Behat\ContextPreparation;

$address = ContextPreparation::startServer('127.0.0.1', realpath(__DIR__.'/../web'));

putenv("BEHAT_PARAMS=extensions[Behat\MinkExtension\Extension][base_url]=http://$address/");

define('BEHAT_PHP_BIN_PATH', getenv('PHP_PEAR_PHP_BIN') ?: '/usr/bin/env php');
define('BEHAT_BIN_PATH',     __FILE__);
define('BEHAT_VERSION',      'DEV');

$app = new Behat\Behat\Console\BehatApplication(BEHAT_VERSION);
$app->run();

这是有效的,但需要调用不同的脚本。所以我仍然在寻找一个适用于@BeforeSuite钩子的解决方案