2020-07-30 05:05:25
在 PHPUnit 测试中运行特定的 Phinx Seeder 并获取生成的记录,可以通过以下步骤实现。这里提供一个清晰的解决方案,包括扩展 Phinx 的 MySQL 适配器以接受现有的 PDO 连接,并在测试中运行 Seeder 和验证数据。
解决方案步骤1. 扩展 Phinx 的 MySQL 适配器首先,创建一个自定义的适配器类,继承自 PhinxDbAdapterMysqlAdapter,并修改构造函数以接受现有的 PDO 连接。
namespace Tests;use PhinxDbAdapterMysqlAdapter;class TestAdapter extends MysqlAdapter{ public function __construct(PDO $pdo) { $this->setConnection($pdo); parent::__construct([ 'name' => $pdo->query('SELECT DATABASE()')->fetchColumn(), 'connection' => $pdo, ]); }}2. 在 PHPUnit 测试中设置在测试类中,使用自定义适配器运行 Seeder,并验证生成的记录。
namespace Tests;use PHPUnitFrameworkTestCase;use PhinxConfigConfig;use PhinxMigrationManager;use SymfonyComponentConsoleInputArrayInput;use SymfonyComponentConsoleOutputNullOutput;class SeederTest extends TestCase{ private PDO $pdo; protected function setUp(): void { // 初始化 PDO 连接(假设已配置测试数据库) $this->pdo = new PDO( 'mysql:host=localhost;dbname=test_db', 'username', 'password' ); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public function testRunSeederAndFetchRecords() { // 1. 配置 Phinx $config = new Config([ 'paths' => [ 'migrations' => 'database/migrations', 'seeds' => 'database/seeds', ], 'environments' => [ 'default_database' => 'test', 'test' => [ 'adapter' => 'testsTestAdapter', // 使用自定义适配器 'name' => 'test_db', ], ], ]); // 2. 创建 Manager 并运行 Seeder $manager = new Manager($config, new ArrayInput([]), new NullOutput()); $manager->seed('SpecificSeederName'); // 替换为你的 Seeder 类名 // 3. 验证生成的记录 $stmt = $this->pdo->query('SELECT * FROM target_table'); // 替换为你的表名 $records = $stmt->fetchAll(PDO::FETCH_ASSOC); $this->assertNotEmpty($records); $this->assertCount(5, $records); // 示例断言,根据实际需求调整 }}3. 关键点说明通过扩展 Phinx 适配器并直接注入 PDO 连接,可以在 PHPUnit 中灵活运行 Seeder 并验证数据。此方法避免了修改生产代码,同时保持测试的独立性和可重复性。根据实际需求调整表名、断言和 Seeder 名称即可。