tbaronnat/functional-test-bundle

与Symfony集成的简单功能测试包系统

安装: 60

依赖者: 0

建议者: 0

安全: 0

星标: 0

分支: 0

类型:symfony-bundle

v1.0.10 2024-03-18 11:08 UTC

This package is not auto-updated.

Last update: 2024-09-30 12:47:21 UTC


README

定义

此包调用配置中定义的所有路由。

它对此路由的“删除”、“创建”、“更新”和“索引”操作进行测试。

  • “索引”操作将访问定义的路由,并检查其是否可访问。
  • “创建”操作将使用有效值填写表单类型,并将表单提交到您的路由,并检查是否所有操作都成功。
  • “更新”操作将使用有效值更新现有的表单类型,并将表单提交到您的路由,并检查是否所有操作都成功。
  • “删除”操作调用您的DELETE路由,并检查所有操作是否成功。

如何使用

1. 在“tests”目录中创建一个控制器类,它扩展自AbstractControllerTest
2. 测试配置示例
tbaronnat_functional_test:
  configs:
    conf_admin:
      userRepository: 'app.repository.admin_user'
      firewall: 'admin'
      userId: 1
    conf_user:
      userRepository: 'app.repository.user'
      firewall: 'main'
      userId: 1
      options: #Any additional options that you want
        option1: 'value1'
        option2: 'value2'
  params:
    dashboard:
      config: 'conf_user'
      action: 'index'
      controller: 'App/Controller/DefaultControllerTest' #The controller used to execute test
      method: 'GET'
      route: 'dashboard'
      finalRoute: 'dashboard'
      locale: 'fr_FR' #Used for example in form fill generator for phone number in selected country locale (default: en_US)
      options: #Any additional options that you want
        option1: 'value1'
        option2: 'value2'

    admin_dashboard:
      config: 'conf_admin'
      action: 'index'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'GET'
      route: 'admin_dashboard'
      finalRoute: 'admin_dashboard'

    admin_user_index:
      config: 'conf_admin'
      action: 'index'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'GET'
      route: 'admin_user_index'
      finalRoute: 'admin_user_index'

    admin_user_update:
      config: 'conf_admin'
      action: 'update'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'POST'
      route: 'admin_user_update'
      routeParams:
        id: 1
      finalRoute: 'admin_user_update'
      finalRouteParams:
        id: 1

    admin_user_delete:
      config: 'conf_admin'
      action: 'delete'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'DELETE'
      route: 'admin_user_delete'
      routeParams:
        id: 1
      finalRoute: 'admin_user_index'
      csrfProtection: false #important if you want that your "DELETE" tests works, disable csrf protections for forms

    admin_user_create:
      config: 'conf_admin'
      action: 'create'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'POST'
      route: 'admin_user_create'
      finalRoute: 'admin_user_index'
      followRedirects: true

3. 添加选项以覆盖配置中的一些逻辑
在您的测试控制器中添加一些逻辑,并替换方法makeRequest的params以从数据库检索现有对象并将“id”替换为动态值。
这样,您可以不必指定要测试的对象的id
例如(如果您想使用它,我可以为它创建RouteParamsTestRepositoryTrait)

// Test configuration in tbaronnat_functional_test.yaml
// for route params "id" or "userId", put any value 

config:
  userRepository: 'app.repository.user'
  firewall: 'main'
  userId: 0
  options:
    repositoryMethod: 'findOneEnabledUser'
    
params:
    admin_user_update:
      config: 'conf_admin'
      action: 'update'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'POST'
      route: 'admin_user_update'
      routeParams:
        id: '-'
      finalRoute: 'admin_user_update'
      finalRouteParams:
        id: '-'
      options:
        repository: 'admin.repository.user'

    admin_user_delete:
      config: 'conf_admin'
      action: 'delete'
      controller: 'App/Controller/DefaultControllerTest'
      method: 'DELETE'
      route: 'admin_user_delete'
      routeParams:
        id: 1
      finalRoute: 'admin_user_index'
      csrfProtection: false
      options:
        repository: 'admin.repository.user'
        repositoryMethod: 'findOneEnabledUser'


// ControllerTest:
use TBaronnat\FunctionalTestBundle\Traits\RouteParamsTestRepositoryTrait;
use TBaronnat\FunctionalTestBundle\Traits\UserConfigTestRepositoryTrait;

class DefaultControllerTest extends AbstractControllerTest
{
    use RouteParamsTestRepositoryTrait;
    use UserConfigTestRepositoryTrait;
    
    protected function getTestParams(string $name, array $params): TestParamsInterface
    {
        $parameters = parent::getTestParams($name, $params);
        $this->replaceIdRouteParams($parameters, 'id');
        return $parameters;
    }
    
    protected function getTestConfig(string $configName): TestConfigInterface
    {
        $config = parent::getTestConfig($configName);
        $this->replaceConfigUserId($config);
        return $config;
    }
}

4. 在项目中使用dama/doctrine-test-bundle以在每次测试后回滚所有数据库更新

带有dama的示例phpunit配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" backupGlobals="false" colors="true" bootstrap="tests/bootstrap.php">
    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".php">src</directory>
        </include>
    </coverage>
    <php>
        <ini name="error_reporting" value="-1"/>
        <server name="APP_ENV" value="test" force="true"/>
        <server name="SHELL_VERBOSITY" value="-1"/>
        <server name="SYMFONY_PHPUNIT_REMOVE" value=""/>
        <server name="SYMFONY_PHPUNIT_VERSION" value="8.5"/>
        <env name="SYMFONY_DEPRECATIONS_HELPER" value="disabled" />
    </php>
    <testsuites>
        <testsuite name="Project Test Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
    <listeners>
        <listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener"/>
    </listeners>
    <!-- Run `composer require symfony/panther` before enabling this extension -->
    <extensions>
        <extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension"/>
        <!--        <extension class="Symfony\Component\Panther\ServerExtension" />-->
    </extensions>
</phpunit>