You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SilverStripe单元测试Fixture文件失效,无法指定测试数据库

搞定SilverStripe单元测试指定数据库的问题

你碰到的这个错误,根源在于SilverStripe的SapphireTest默认会自动创建临时测试数据库,但你的数据库用户wai没有创建新数据库的权限。要改用固定的测试数据库而非临时库,得调整几个关键配置:

1. 调整phpunit.xml,禁用临时库并指定测试数据库

在你的phpunit.xml里加入环境变量配置,覆盖默认的测试数据库行为:

<phpunit bootstrap="vendor/silverstripe/framework/tests/bootstrap.php" colors="true">
    <testsuite name="Default">
        <directory>app/tests</directory>
    </testsuite>
    <groups>
        <exclude>
            <group>sanitychecks</group>
        </exclude>
    </groups>
    <!-- 新增测试数据库配置 -->
    <php>
        <!-- 核心:关闭临时数据库创建 -->
        <env name="SS_TEST_DATABASE_TEMP" value="false"/>
        <!-- 指定你的测试数据库名 -->
        <env name="SS_DATABASE_NAME" value="test"/>
        <!-- 以下根据你的实际数据库配置调整 -->
        <env name="SS_DATABASE_SERVER" value="localhost"/>
        <env name="SS_DATABASE_USERNAME" value="wai"/>
        <env name="SS_DATABASE_PASSWORD" value="your_db_password"/> <!-- 如果数据库有密码的话 -->
    </php>
</phpunit>

重点提醒:

  • SS_TEST_DATABASE_TEMP设为false是关键——这会让SilverStripe放弃创建临时库,转而使用你指定的固定数据库。
  • 一定要手动提前创建好test数据库(比如用SQL命令CREATE DATABASE test;或者数据库管理工具),因为现在系统不会自动帮你创建了。

2. 额外检查:Fixture文件路径是否正确

你的PageTest里指定了static $fixture_file = 'fixtures.yml';,要确认这个文件和PageTest.php在同一个目录(也就是app/tests下),不然fixture数据加载不进来。如果路径不对,可以改成完整相对路径,比如app/tests/fixtures.yml。

3. 最后验证

配置完后重新运行phpunit命令,现在应该会连接你指定的test数据库,不会再触发创建临时库的权限错误了。另外别忘了确保用户wai对test数据库有足够权限(比如增删改查、创建表等),这样测试才能正常操作数据。

内容的提问来源于stack exchange,提问作者Wai Yan Hein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:39:42