使用app / Config / Schema / schema.php设置CakePHP测试数据库

时间:2014-06-26 15:36:12

标签: database cakephp cakephp-2.5

我正在使用buildbox.io设置自托管持续集成。我需要在测试数据库中创建表和列。

在我自己的计算机上,我一直在使用public $import = 'MyTable';用于每个装置,从$default中的database.php数据库连接复制表格防御。它运行良好,因为我的开发数据库始终是最新的迁移。

另外,以另一种方式执行此操作似乎是一件非常痛苦的事情,每当您对数据库进行更改时,您必须手动将数据库字段定义保持在灯具中。考虑到app/Config/Schema/schema.php

中的字段列表已经是最新的,这似乎特别多余

在服务器上,使用public $import = 'MyTable';无法正常工作。即使我确实想在运行测试时使登台数据库成为我的默认配置,也不能依赖登台数据库随时更新。

所以,我的问题是,我该怎么做?有没有办法告诉Cake使用schema.php中的定义来从fixture中构建测试数据库?或者是我在所有灯具中手动添加字段定义的唯一方法? (这似乎是一个巨大的痛苦!)

2 个答案:

答案 0 :(得分:1)

我为灯具做的只是更新一组包含测试数据的sql语句。该文件类似于schema_MD5HASH.sql。

当我的测试运行时,它会获取我的应用程序的schema.php文件的sql哈希,并使用它来运行关联的schema_MD5HASH.sql。如果文件不存在,则测试失败,然后只需要一个额外的版本来记住构建我的灯具。

我一直在玩的其他东西是:

  • 使用每个字段的额外数据为模式添加注释 - 类似于field_type
  • 在工具中加载模式文件并读取特定表
  • 解析field_type并根据Faker
  • 等库生成虚假数据

这种方式有点奇怪,你必须要小心,架构转储不会覆盖你的注释,但它的工作方式还可以。

答案 1 :(得分:0)

好的,我已经找到了一个我很满意的解决方案,这需要对我的代码进行最少的更改。

对于Buildbox CI环境,我以前只使用一个数据库 - 测试数据库。我现在添加了另一个,所以我有一个测试和默认数据库(以及$test$default数据库配置)。

在Buildbox引导过程中(运行bootstrap.sh - 位于CI服务器上的文件,在应用程序外)我调用Console/cake schema create,这将填充{{1}的默认数据库}。

现在,我可以正常运行我的测试,他们将从默认数据库中复制表定义,我的schema.php设置建议。

因此,默认数据库永远不会包含任何数据 - 它只存在,因此可以从$import创建,因此可以在我的测试中用于导入表定义。

这是我的Buildbox bootstrap.sh中的Cake-sepcific行:

schema.php