Sqlite在unti测试中忽略数据库约束



我正在尝试测试数据库中的某个模型是否可以(或不能(根据一些相关的模型/数据库约束删除。

我在Laravel单元测试中使用了SQLite,但它似乎忽略了限制,并且当我分解了没有首先删除的相关模型时,它总是允许删除在测试中不会出错。

这只是一个sqlite的事情,还是有一些我不知道的设置?

这是我的测试的一个简单版本

/** @test */
public function product_canot_be_deleted()
{
$product = factory(Product::class)->create([
'deletion_flag' => 1
]);
factory(Service::class)->create([
'product_id' => $product->id
]);
$this->artisan('products:delete');
$this->assertCount(1, Product::all());
$this->assertCount(1, Service::all());
}

该命令只是循环遍历表中已标记为要删除的所有产品。此测试失败并允许删除产品。当产品具有关联的服务时,不应将其删除。相关的线路服务迁移文件看起来像这个

$table->integer('product_id')->unsigned();
$table->foreign('product_id')->references('id')->on('products');

没有提及级联删除。

默认情况下,sqlite中会禁用外键约束。

来自文档:

默认情况下禁用外键约束(用于向后兼容性(,因此必须为每个数据库单独启用联系(但是,请注意,SQLite的未来版本可能更改,以便在默认情况下启用外键约束。仔细的开发人员不会对是否为外国做出任何假设键在默认情况下是启用的,但会将其启用或禁用为必要。(


在5.7中,Laravel中添加了一个启用外键的配置选项,因此您可以执行以下操作:

文档

要为SQLite连接启用外键约束,您应该将DB_FOREIGN_KEYS环境变量设置为true:

DB_FOREIGN_KEYS=true


或者您可以将foreign_key_constraints添加到数据库配置中:

文档

要为SQLite连接启用外键约束,您应该将foreign_keyconstraints选项添加到config/database.php配置文件:

'sqlite' => [
// ...
'foreign_key_constraints' => true,
],

最新更新