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
相关产品推荐
相关产品推荐

