我有以下代码:
/** @test */
public function it_updates_customer_status_to_deactivated_for_admin_users()
{
$this->hubAdminUser = factory(User::class)->state('admin')->create();
$this->customer = Customer::first();
$this->customer->status_id = 2; //active
$this->customer->save();
// this will update status_id to 3
$this->actingAs($this->hubAdminUser)
->patch(route('hub.customer.updateStatus', $this->customer))
->assertRedirect();
$this->assertDatabaseHas('tenants', [
'id' => $this->customer->id,
'status_id' => 3, //deactivated
]);
}
->patch(route('hub.customer.updateStatus', $this->customer))
行会将status_id
的值从2更改为3,这确实是这样,因为我什至在$this->customer->refresh()->status_id
行之后尝试过->assertRedirect();
,这给了我3。这是失败的,因为它说客户的 status_id
在数据库中设置为 2。有什么想法可以解决这个问题吗?
我建议您将
assertDatabaseHas
更改为 assertEquals
。
原因如下:
“当您使用 Eloquent 时,您可以指定一个表名称 - 或者它会自动计算出它。然后,您就会忘记它。因此,它的理想设计是让您不必知道表的名称。”
“Laravel 的架构使得我们不必知道数据库表的名称。使用
assertDatabaseHas
,您每次使用时都必须知道表的名称。”
“但是,我认为最好在不需要时停止直接针对数据库进行断言。特别是因为您的代码通常不是在 Laravel 中构建来直接处理数据库的,为什么要进行测试?留在您的域中并测试输入和输出值,而不是实现。”
来自文章https://www.aaronsaray.com/2020/stop-assert-database-has-laravel