2016-11-15 9 views
0

У меня есть следующие каталоги структуры:Behat 3 + Symfony 3 Контекст с пространством имен не работает, когда без работы

composer.json 
behat.yml 
src 
|--AppBundle 
    |--Features 
     |--example.feature 
     |--Context 
     |--FeatureContext.php 

И следующий behat.yml

default: 
    autoload: 
    '': 'src/AppBundle/Features/Context' 
    suites: 
    default: 
     paths: ['src/AppBundle/Features'] 
     contexts: 
     - FeatureContext: 
      session: '@session' 
    # and extensions standard for Symphony 

И FeatureContext.php содержит

<?php 

//namespace AppBundle\Features\Context; 

use Behat\Behat\Context\Context; 
use Behat\MinkExtension\Context\MinkContext; 

/** 
* Defines application features from the specific context. 
*/ 
class FeatureContext extends MinkContext implements Context 
{ ... } 

Прокомментировано namespace. Когда я запускаю behate, теперь контекст найден правильно. Когда я раскомментировать имен возникает ошибка:

[Behat\Behat\Context\Exception\ContextNotFoundException]
FeatureContext context class not found and can not be used.

Как сделать его работу, когда имен в FeatureContext.php является раскомментирована? Я мало знаю о PSR-0 и PSR-4, но если проблема может быть связана с этим, я добавляю фрагмент composer.json.

"autoload": { 
    "psr-4": { 
     "": "src/" 
    }, 
    "classmap": [ 
     "app/AppKernel.php", 
     "app/AppCache.php" 
    ] 
}, 
"autoload-dev": { 
    "psr-4": { 
     "Tests\\": "tests/" 
    } 
}, 

Я ищу лучшие практики кодирования, так что, если я делаю что-то плохое, как я голосовать за соответствующее предложение.

  • мне кажется, я должен иметь пространство имен в FeatureContext.php, а не я?
  • Кажется, я не должен использовать PSR-0 в composer.json, должен ли я?

ответ

2

Посмотрите пример ниже. Полный пример здесь: http://www.inanzzz.com/index.php/post/l41o/testing-a-basic-auth-symfony-api-with-behat3 Здесь вы также можете найти более примеры примеров: http://www.inanzzz.com/index.php/posts/behat

Примечание 1: Вы можете получить доступ к session в файлах контекста напрямую, поэтому его не нужно вводить. Возможно, вам потребуется использовать implements KernelAwareContext или implements KernelAwareInterface или implements ContainerAwareInterface. Просто проверьте сообщения в блоге выше.

Примечание 2: Вам не нужно autoload-dev в composer.sjon вообще. Избавиться от этого.

composer.json

Примечание: Используйте новые версии!

{ 
    "require-dev": { 
     "behat/behat": "3.0.15", 
     "behat/symfony2-extension": "2.1.0", 
     "behat/mink": "1.7.0", 
     "behat/mink-extension": "2.1.0", 
     "behat/mink-browserkit-driver": "1.3.0" 
    }, 
} 

behat.yml

default: 
    extensions: 
     Behat\Symfony2Extension: ~ 
     Behat\MinkExtension: 
      base_url: http://your_local_app_domain.com/app_test.php/ 
      sessions: 
       symfony2: 
        symfony2: ~ 
    suites: 
     api: 
      type: symfony_bundle 
      bundle: ApplicationApiBundle 
      mink_session: symfony2 
      contexts: 
       - Application\ApiBundle\Features\Context\FeatureContext: 
        param: 'whatever' 

FeatureContext.PHP

namespace Application\ApiBundle\Features\Context; 

use Behat\MinkExtension\Context\MinkContext; 

class FeatureContext extends MinkContext 
{ 
    private $param; 

    public function __construct($param) 
    { 
     $this->param = $param; 
    } 

    ...... 
} 

Тест

$ bin/behat --suite=api @ApplicationApiBundle/YourFeature.feature