Silverstripe测试中Element类controller_class配置无法正常注入问题
问题根本原因
Silverstripe 测试上下文默认不会自动扫描实现了TestOnly接口的类的静态配置,你本地执行的dev/build和清理web缓存的操作针对的是正常web访问的运行环境,和测试环境的配置栈完全隔离,所以不会生效。
可行解决方案
- 方案1:将测试类注册到测试的额外数据对象清单
在你的测试类NestedElementForms中添加$extra_dataobjects属性,声明需要加载的TestOnly类,测试运行器会自动扫描这些类的静态配置:
class NestedElementForms extends FunctionalTest { protected static $fixture_file = 'NestedElementFormsFixture.yml'; // 新增这一行,替换为你实际的类命名空间 protected static $extra_dataobjects = [ MockFormElement::class ]; /** * @test */ public function submitFormOnElement() { $this->assertEquals(MockFormElementController::class, MockFormElement::config()->controller_class, 'Injection failed'); } }
- 方案2:在setUp方法中手动覆盖配置(优先级最高,最稳妥)
直接在测试初始化的时候手动设置配置值,不受配置加载逻辑影响:
class NestedElementForms extends FunctionalTest { protected static $fixture_file = 'NestedElementFormsFixture.yml'; protected function setUp(): void { parent::setUp(); // 手动设置配置 MockFormElement::config()->set('controller_class', MockFormElementController::class); } /** * @test */ public function submitFormOnElement() { $this->assertEquals(MockFormElementController::class, MockFormElement::config()->controller_class, 'Injection failed'); } }
内容的提问来源于stack exchange,提问作者David Peck
相关产品推荐
相关产品推荐

