【发布时间】:2020-03-15 04:59:16
【问题描述】:
我正在尝试根据一些相关的模型/数据库约束来测试我的数据库中的某个模型是否可以(或不能)被删除。
我在我的 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');
没有提及级联删除。
【问题讨论】:
-
我在 6.0.好的,我如何添加
foreign_key_constraints设置?看起来正是我需要的。 -
根据docs,您可以在
phpunit.xml文件中添加DB_FOREIGN_KEYS=true环境变量,类似于<env name="DB_FOREIGN_KEYS" value="true"/>。 -
好的,想通了。在我的 PHPUnit.xml 中有这一行。
<env name="DB_CONNECTION" value="testing"/>所以在database.php配置文件中,我将此行添加到testing块中:'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),现在可以完美运行。感谢您的帮助。 -
@JohnHalsey:考虑添加你的答案。这更加明显,您还可以对其进行详细说明,代码示例/ sn-ps 等。这对 Stackoverflow 最有效。一段时间后,您甚至可以接受自己的答案。只是说。
标签: php laravel sqlite phpunit