为了避免端口冲突,我在可用端口上的@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。我错过了一些明显的东西吗?
答案 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钩子的解决方案