【发布时间】:2016-10-28 10:23:43
【问题描述】:
我发现 CakePhp 3 在集成测试中使用了真实的数据库连接,所以即使提供了固定装置,$this->post('articles/delete/1') 这样的行也会删除真实的数据库行。是否可以仅使用夹具提供的数据(测试连接)?模型测试在使用测试连接的夹具上正常工作。
【问题讨论】:
标签: php phpunit cakephp-3.0
我发现 CakePhp 3 在集成测试中使用了真实的数据库连接,所以即使提供了固定装置,$this->post('articles/delete/1') 这样的行也会删除真实的数据库行。是否可以仅使用夹具提供的数据(测试连接)?模型测试在使用测试连接的夹具上正常工作。
【问题讨论】:
标签: php phpunit cakephp-3.0
CakePHP 在基于夹具的测试用例过程中执行以下操作:
1. Creates tables for each of the fixtures needed.
2. Populates tables with data, if data is provided in fixture.
3. Runs test methods.
4. Empties the fixture tables.
5. Removes fixture tables from database.
所以正如 cake 的 documentation cakephp 中提到的那样,它清空了夹具表,无论是删除记录还是保存记录或进行任何其他操作。
【讨论】:
我找到了问题的原因。
在我的 bootstrap.php 中,我将事件侦听器绑定到应用程序事件。在侦听器的构造函数中,我使用 TableRegistry::get() 使用模型对象初始化属性。
原因是 TableRegistry 会记住在第一次调用时使用的连接,这样 ConnectionManager::alias() 将不起作用。因为我在事件的构造函数中进行了 TableRegistry 初始化,所以在加载主应用程序之前调用了它,并且 fixtureManager 添加了连接别名。
所以不要在应用加载之前调用 TableRegistry,否则可能会导致问题。
【讨论】: