独立Symfony2捆绑包内的功能测试

时间:2014-12-16 09:28:19

标签: symfony testing service phpunit bundle

我需要直接在独立的捆绑包中进行一些功能测试。我不想测试控制器,只是实际服务之间的一些交互。

我想知道是否有标准/最好的方法来做到这一点。我是单向做的,但想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:33)

这是我自己的解决方案(我总结了在独立捆绑中进行测试的所有过程):

<强> 1。首先,一个好的bundle有自己的composer.json来定义它的依赖关系:

{
    "name": "my/own-bundle",
    "type": "symfony-bundle",
    "description": "Symfony2 bundle that provides ...",
    "keywords": ["my","own"],
    "license": "MIT",
    "authors": [
        {
            "name": "John Doe",
            "email": "john.doe@omg.wtf"
        }
    ],
    "require": {
        "php": ">=5.3.2",
        "symfony/framework-bundle": ">=2.3"
    },
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    },
    "autoload": {
        "psr-0": { "My\\OwnBundle": "" }
    },
    "target-dir": "My/OwnBundle",
    "minimum-stability": "dev"
}

请注意我们对服务测试所需的symfony/framework-bundle依赖项的使用。您当然可以降低在symfony核心上指定自己的实际依赖关系的依赖关系。

使用此文件,我可以处理命令(执行此操作)以构建我的包的供应商目录:

$ composer update

<强> 2。然后,我设置了我的phpunit配置文件:

<!-- phpunit.xml.dist -->

<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="Tests/bootstrap.php"
>
    <testsuites>
        <testsuite name="MyOwnBundle Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

第3。然后,我在我的测试目录中为类的自动加载设置了php bootstrap:

// Tests/bootstrap.php

$file = __DIR__.'/../vendor/autoload.php';
if (!file_exists($file))
{
    $file = __DIR__.'/../../../../../../vendor/autoload.php';
    if (!file_exists($file))
        throw new RuntimeException('Install dependencies to run test suite.');
}

$autoload = require_once $file;

这些步骤是独立捆绑包中任何测试的标准步骤。

<强> 4。现在,我想模拟一个应用程序,对我的服务进行一些功能测试:

我需要一个内核类:

// Tests/AppKernel.php (you can define it in a subdirectory /Fixtures if you prefer)

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array();

        if (in_array($this->getEnvironment(), array('test'))) {
            $bundles[] = new Symfony\Bundle\FrameworkBundle\FrameworkBundle();
            $bundles[] = new My\OwnBundle\MyOwnBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config.yml');
    }
}

以及相应的config.yml

# Tests/config.yml

framework:
    secret: test
    session:
        storage_id: session.storage.mock_file

my_own:
    test: 2

以下是会话模拟的示例。如果您想要访问某些服务,请不要忘记指定正确的框架配置节点(如果您没有指定节点session,那么您没有服务session )。

<强> 5。最后,我可以在我的测试类中检索以下服务:

// Tests/Functional/Handling/Handler.php

namespace My\OwnBundle\Tests\Functional\Handling;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class HandlerTest extends WebTestCase
{
    private $handler;

    protected function setUp()
    {
        require_once __DIR__.'/../../AppKernel.php';

        $kernel = new \AppKernel('test', true);
        $kernel->boot();
        $container = $kernel->getContainer();
        $this->handler = $container->get('my_own.handling.handler');
    }

    public function testHandle()
    {
        $this->assert($this->handler->handle());
    }
}