PHPUnit/ Silverstripe 测试 returns "Couldn't run query", "Table doesn't exist"

PHPUnit/ Silverstripe Testing returns "Couldn't run query", "Table doesn't exist"

我在同一个 WAMP 2.5 环境中有两个 Silverstripe 网站 运行,共享同一个 _ss_environment.php 文件(设置数据库权限等)

两者都是:

当我转到本地主机时。example/dev/tests 我得到完全不同的行为:

站点 #1 运行 测试没有任何问题并且 returns 预期输出。

站点 #2 不会 运行 任何测试并返回此类错误:

Couldn't run query:

SELECT DISTINCT "Group"."ClassName", "Group"."LastEdited", "Group"."Created", "Group"."Title", "Group"."Description", "Group"."Code", "Group"."Locked", "Group"."Sort", "Group"."HtmlEditorConfig", "Group"."ParentID", "Group"."ID", CASE WHEN "Group"."ClassName" IS NOT NULL THEN "Group"."ClassName" ELSE 'Group' END AS "RecordClassName"

FROM "Group"

WHERE ("Group"."ID" = ?)

LIMIT 1

Table 'ss_tmpdb6760406.group' doesn't exist

这到底是怎么回事?

站点 #2 确实安装了更多模块,但我看不出这会如何影响 MySQL permissions/behavior。

对我来说唯一有意义的区别是站点 #1 是 3.2.0RC1 上的干净作曲家安装,而站点 #2 已从早期版本的 Silverstripe(通过作曲家)升级。

有没有人知道发生了什么以及我如何让 Site #2 正确测试?

从站点 #2 中删除两个未维护的模块后,单元测试工作正常。

我猜模块中存在错误,但我不明白它们如何在不相关的测试中导致数据库错误。

我建议您尝试更改 MySQL 中的区分大小写设置。我以前也见过类似的东西,貌似是随机出现的,而且通常是在主库上而不是在测试下。

我对 WAMP 没有太多经验,但听起来您需要找到 my.ini (saving MySQL settings) 并调整以下设置:

lower_case_table_names=2

查看文档:http://dev.mysql.com/doc/refman/5.1/en/identifier-case-sensitivity.html 还有这个问题:How to force case sensitive table names?

我不能保证这会解决你的问题,但这是我首先要检查的地方,假设 SQLite 不是你的选项,如上面的评论所示。

我遇到了类似的问题。我的解决方案是 完全 清除 silverstripe-cache 目录(或您的特定 TEMP_FOLDER 常量指向的目录)和 运行 sake dev/build.

不确定为什么,但我相信在构建 class 清单时在某个时候出现了错误,该清单被缓存并且以某种方式阻止了正确重建数据库模式,导致大多数表被创建除了少数然后被夹具文件插入(然后触发此错误)。解释为什么它在 CI 服务器上有效,但在我的本地机器上无效。单元测试应该完全隔离...