Laravel测试中是否存在assertSoftDeleted的反向断言?
验证模型未被软删除的Laravel原生优雅方式
好问题!你现在用的$this->assertTrue(! $goal->fresh()->trashed());确实能解决问题,但Laravel测试套件里其实有更贴合原生风格的方法,分两种情况来说:
Laravel 8+ 版本:使用
assertModelExists
从Laravel 8开始,测试套件新增了assertModelExists方法,它会自动验证模型对应的数据库记录存在且未被软删除(内部会检查deleted_at字段是否为null)。用法非常简洁:$this->assertModelExists($goal);这个方法完全替代了你手动判断
trashed()的逻辑,既优雅又符合Laravel测试的设计规范。Laravel 7及更早版本:结合
assertDatabaseHas检查软删除字段
如果你的项目还在用较旧的Laravel版本,可以直接用assertDatabaseHas来验证deleted_at字段为null,这也是原生的解决方案:$this->assertDatabaseHas('goals', [ 'id' => $goal->id, 'deleted_at' => null ]);这种写法直接针对数据库字段做断言,逻辑清晰,比手动调用
fresh()->trashed()更贴合测试套件的断言风格。
另外补充一句:你当前的实现完全没问题,但用原生断言方法会让测试代码更易读,也和Laravel测试的整体风格保持一致。
内容的提问来源于stack exchange,提问作者krystian2160
相关产品推荐
相关产品推荐

