Php Silverstripe单元测试修改实时数据库(postgres模块)

Php Silverstripe单元测试修改实时数据库(postgres模块),php,silverstripe,Php,Silverstripe,我有一个3.1.12版的网站,使用postgres模块0.92版 我刚刚将所有内容分别升级到3.5.3和1.2。除了我现有的和未更改的单元测试中的一些奇怪行为之外,一切都很好。当测试以编程方式创建对象时似乎会发生,如下所示: $page=new Page(); $page->Title='Read only success'; $page->write(); 在3.1和0.92上,测试将运行,然后返回成功。在tmp数据库中执行上述工作 升级后,相同的测试在没有任何修改的情况下运行并

我有一个3.1.12版的网站,使用postgres模块0.92版

我刚刚将所有内容分别升级到3.5.3和1.2。除了我现有的和未更改的单元测试中的一些奇怪行为之外,一切都很好。当测试以编程方式创建对象时似乎会发生,如下所示:

$page=new Page();
$page->Title='Read only success';
$page->write();
在3.1和0.92上,测试将运行,然后返回成功。在tmp数据库中执行上述工作

升级后,相同的测试在没有任何修改的情况下运行并返回成功。只有这一次,工作是在当前的实时数据库中完成的。在上面的例子中,我的管理站点树中有一个新的草稿页面


有人见过这个吗?我已经穷尽了寻找答案的努力,并且能够追踪到底是什么导致了这种危险的行为。

如果您没有在测试中使用夹具文件,您需要确保您告诉SapphireTest使用测试数据库:

protected $usesDatabase = true;
否则,创建这样的数据对象将直接写入主数据库

如果您使用的是夹具文件,这是隐含的,因此只有在您不使用时才有必要


.

谢谢!成功了。尽管我发现单元测试可能对主数据库进行任何更改是非常危险的。未经初始化的开发人员可以很容易地编写一个测试,而不知道使用此标志或设备可能会导致实时更改。这在3.1中是原子的。我不知道这种改变的意图是什么。我完全同意你的看法,认为违约应该是“真实的”,除非另有规定,而不是当前的行为。我们非常欢迎您在这个框架上创建一个RFC!行。我认为这实际上意味着,目前的postgres模块测试已经中断。因为它以编程方式创建页面,而不使用此选项。此测试有效地将页面添加到当前sitetree。@Aaryn yes,true:)pull请求将是理想的。我猜设置用于“加速”测试(生成装置需要很长时间),而开发人员不希望在实时环境中运行测试。这就是开发/测试环境的用途。除非您测试特定的Postgres功能,否则我建议您使用内存中的sqlite来加速测试,请参阅链接“谢谢”。看起来很有趣!实际上,我不同意使用备用RDBMS。如果您有一个支持Postgres的应用程序,并且您的应用程序依赖于数据库的存在(SilverStripe就是这样做的),那么根据正在运行的测试的性质(集成/行为/单元),您应该测试一个支持Postgres的应用程序,而不是一个支持SQLite的应用程序。