LaravelassertDatabaseHas 在 phpunit 测试中不起作用

问题描述 投票:0回答:1

我有以下代码:

/** @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。有什么想法可以解决这个问题吗?

database laravel unit-testing testing phpunit
1个回答
0
投票

我建议您将

assertDatabaseHas
更改为
assertEquals

原因如下:

“当您使用 Eloquent 时,您可以指定一个表名称 - 或者它会自动计算出它。然后,您就会忘记它。因此,它的理想设计是让您不必知道表的名称。”

“Laravel 的架构使得我们不必知道数据库表的名称。使用

assertDatabaseHas
,您每次使用时都必须知道表的名称。”

“但是,我认为最好在不需要时停止直接针对数据库进行断言。特别是因为您的代码通常不是在 Laravel 中构建来直接处理数据库的,为什么要进行测试?留在您的域中并测试输入和输出值,而不是实现。”

来自文章https://www.aaronsaray.com/2020/stop-assert-database-has-laravel

© www.soinside.com 2019 - 2024. All rights reserved.