2014-10-07 21 views
2

我需要添加内容,稍后从上下文中检索behat.yml文件中的额外选项/配置。Behat 3 - 如何在上下文中检索自定义扩展

Behat不允许我将一些随机参数添加到behat.yml文件中,所以我创建了新的自定义扩展。这个扩展让我通过特定的配置值

extensions: 
    App\Behat\DevToolsExtension: 
     api_url: "https://api.example.com" 

所以现在贝哈特不是在抱怨behat.yml文件中的新配置。

现在我卡住了。如何从运行时的扩展中检索此配置?

我像这样设置公共职能负载(ContainerBuilder $容器,数组$配置)方法中,我扩展现有的参数:

$container->setParameter($configKey . $key, $config[$key]); 

再次,有没有办法来检索此ContainerBuilder对象或DevToolsExtension上下文中的对象?

编辑

解决方案是创建服务容器,并通过behats ContainerBuilder到它像这样:

class AppExtension implements ExtensionInterface 
{ 
    // ... 
    public function load(ContainerBuilder $container, array $config) 
    { 
     $configKey = $this->getConfigKey() . '.'; 

     foreach ($this->keys as $key) { 
      $keyValue = $configKey . $key; 
      $container->setParameter($keyValue, $config[$key]); 
     } 

     $this->getServiceLocator()->setBehatContainer($container); 
    } 

然后用服务定位器来检索配置参数

$value = $this->getBehatContainer()->getParameter($key); 

回答

1

这是个好题。基本上下文没有引用返回顶部,所以你不能从那里真正发现哪些扩展被加载。扩展程序被初始化并挂接到内部事件系统中。当上下文被初始化时,他们会得到通知,并可以将必要的参数传递给它们。知道这一点,您可以创建一个适当的扩展,将其挂接到Behat事件系统,并将配置传递到您的上下文 - 这将是实现这一目标的方法。

水貂扩展就是一个很好的例子,你可能不会找到任何文档,但是你可以在你的(Mink)上下文中创建一个构造函数,在那里添加一个断点,并按照跟踪来找出如何整个事情起作用。

但是...在大多数情况下,这将是一个矫枉过正。使用可以从上下文加载的外部配置文件或通过向您的上下文传递参数(与现在使用扩展相同),也可以(也应该)实现相同的功能。如果您有许多需要配置的上下文,最后一个选项可能无法很好地工作。

1

我有这个问题,并解决了这个项目:CLIPBOARD

可以肯定,工作〜3.0 大概工作V2.5。

在您的Exntesion类中,在创建扩展之后,您需要初始化器来初始化系统中的任何上下文。为此,您需要使用ContextExtension :: INITIALIZER_TAG在容器中创建服务,并取决于配置。我有

$container->setParameter('dev_tools_extension.parameters', $config); 

然后

private function loadContextInitializer(ContainerBuilder $container) 
{ 
    $definition = new Definition(
     'App\Behat\DevToolsExtension\Context\Initializer\DevToolsExtensionInitializer', array(
      '%dev_tools_extension.parameters%' 
     ) 
    ); 
    $definition->addTag(ContextExtension::INITIALIZER_TAG, array('priority' => 0)); 
    $container->setDefinition('dev_tools_extension.context_initializer', $definition); 
} 

初始化程序实现贝哈特\贝哈特\背景\初始化程序\ ContextInitializer与所谓的上下文。接下来创建(例如Interface)并调用上下文的函数。我有:

/** 
* Initializes provided context. 
* 
* @param Context $context 
*/ 
public function initializeContext(Context $context) 
{ 
    if (!$context instanceof ClipboardContextInterface) { 
     return; 
    } 
    /** @var ClipboardContextInterface $context */ 

    $context->setClipboard($this->clipboard); 
}