【问题标题】:How to use phinx migration tool with codeception test framework如何将 phinx 迁移工具与 codeception 测试框架一起使用
【发布时间】:2015-12-08 20:45:35
【问题描述】:

我在客户端和服务器端 JavaScript 应用程序开发方面有一些经验。但是现在我在 php 上设计了我的第一个 Web 应用程序并寻找最好的开发工具堆栈。 我使用 phinx 在测试、开发和生产环境之间共享我的数据库结构。我将使用 codeception 进行数据库操作测试。

问题在于,codeception 期望我将创建表的 sql 命令放在 tests/_data/dump.sql 中,并删除我在 phinx 迁移文件中创建的所有表。我可以在codeception.yml 中设置cleanup: false,但在这种情况下,我必须在每次测试之前清理数据库表。我不知道怎么做。在代码接收中的每次测试之前,我发现没有手动清理数据库的能力。

我如何获得代码接收和 phinx 协调?

PS:我找到了discussion about using migrations in codeception,似乎它的好处并不适合所有人。

【问题讨论】:

  • 抱歉,您进入了未知领域。我听说过很多基于 MySQL 的框架,但 phinxcodeception 对我来说是新的。可能其他人也同样无知,因为已经有 4 周没有吃一点东西了。

标签: php mysql codeception phinx


【解决方案1】:

使用 Codeception 你可以为任何你想要的东西创建一个helper,包括迁移加载。

这是在每次测试之前加载数据库迁移的助手。我没有机会测试这段代码,但这里的主要思想应该很清楚。

代码接收助手:

namespace Codeception\Module;

use Codeception\Module;
use Codeception\TestInterface;
use Phinx\Console\PhinxApplication;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\NullOutput;

class FixtureHelper extends Module
{
    /**
     * Run database migrations before each test if database population enabled.
     *
     * @param TestInterface $test
     */
    public function _before(TestInterface $test)
    {
        $populate = $this->getModule('Db')->_getConfig('populate');

        if ($populate) {
            $this->migrateDatabase();
        }
    }

    /**
     * Run the database migrations.
     */
    public function migrateDatabase()
    {
        // Run Phinx console application.
        $app = new PhinxApplication();
        $app->setAutoExit(false);

        $output = new NullOutput();
        //$output = new ConsoleOutput();

        // Run database migrations for test environment.
        $input = new StringInput('migrate -e test');
        $app->run($input, $output);

        // ... you also can load the fixtures here
        //$input = new StringInput('seed:run -s <my-seeds> -e test');
        //$app->run($input, $output);
    }
} 

代码接收配置(用于功能测试):

actor: FunctionalTester
modules:
  enabled:
    - ... your modules
    - FunctionalHelper
    - FixtureHelper
  config:
    Db:
      dsn: '... dsn'
      user: '%DB_USER%'
      password: '%DB_PASSWORD%'
      dump: 'tests/_data/dump.sql'
      populate: true
      cleanup: true
    FixtureHelper:
      depends: Db

数据库转储(tests/_data/dump.sql):

-- Dump should not be empty because cleanup will not work. 
-- So at least any silly sql query.
SELECT 1+2 AS veryComplicatedCalculations;

Phinx 配置 (phinx.yml) 必须与 Codeception 配置 (codeception.yml) 位于同一目录中,否则您必须确保 PhinxApplication 加载您的配置。

希望对您有所帮助!

【讨论】:

  • 感谢您的好回答。我以一种不同的方式——不是那么干净——的方式。
  • 旁注:您可以使用-c 参数加载配置文件:docs.phinx.org/en/latest/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2021-06-29
  • 2022-12-09
  • 2011-01-04
相关资源
最近更新 更多