如何在 Symfony 中实现自己的 Faker 提供程序

问题描述

为了减少我的夹具类中的一些代码重复,我想在我的 Symfony 5 应用程序中为 Faker (fakerPHP/faker) 创建一个自定义提供程序。我在哪里可以在我的应用程序中创建自定义的 faker 提供程序?请注意,我是 Symfony 开发的新手。

我找到了与此主题相关的 this question for Laravel,但当然 Symfony 有不同的项目设置。

读到 the documentation of a related library,我希望我可以使用 $faker->addProvider(),但是我又不知道这段代码应该放在我的 Symfony 应用程序中的什么位置。

我幻想我应该为此功能创建一个服务,或者我应该将它添加到我的 BaseFixture 类中?但这些对我来说只是胡乱猜测。

解决方法

您将提供商置于何处是一个主观问题。有些使用 src/Test/(或命名空间 App\Test)来表示不是实际测试的测试相关代码。其他人会将它放在 tests/ 目录中某个位置的测试旁边,例如tests/Faker/(命名空间为 App\Tests\Faker)。后者的好处是,这些类只会被 autoload-dev 获取,而不是在生产中。

关于您问题的第二部分,如何将提供程序添加到 Faker 取决于您在测试中如何使用它或更准确地说,如果您想从容器中获取共享的 faker 实例或手动创建一个。特别是如果您的提供者依赖于其他服务,例如 Doctrine,您可能希望将其注册到容器中,或者您应该重新考虑您的提供者,因为依赖于数据库可能会导致问题,例如当您重置测试数据库时,您的提供者的数据池可能会消失。

我会在您的测试中创建一个 faker 实例,因为启动 Faker 的成本相对较低,如果多次进行,它不会明显减慢您的测试速度,并且您将被迫避免将提供者与来自您的生产代码意外。如果与您相关,您还可以更好地控制如何创建伪造实例以及要为特定测试加载哪些提供程序。例如,您可以在测试的 setUp 方法中创建一个实例:

class MyTest extends TestCase
{
    private $faker;

    protected function setUp(): void
    {
        // The Faker\Factory will create a ready to use Faker Generator
        $this->faker = Factory::create();
        $this->faker->addProvider(new MyCustomProvider());
    }

    public function testSomething(): void
    {
        $title = $this->faker->title;
    }
}

工厂将创建一个新的 Faker\Generator,其中所有默认提供程序都已注册。如果您只想在其中拥有自己的提供商,则可以查看 at the code 。您可以共享它,而不是在每个测试中复制此代码,例如通过创建您自己的测试扩展的 TestCase 类而不是 PHPUnit 提供的类,或者您可以使用特征。我认为这两种方法都不错,但如果您还不熟悉 Traits,可能有自己的基础 TestCase。

使用上面的 setUp 方法,您还可以查看 how Symfony's Service Container works,especially how to create services through a factory,然后,例如创建一个 config/services_test.yaml,您可以在其中创建一个伪造实例,您可以在测试扩展 WebTestCase 或启动 Symfony 内核后的 KernelTestCase。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...