General error: 1 no such table: App\Models\ModelName while testing laravel

General error: 1 no such table: App\Models\ModelName while testing laravel

我的测试:

class FloorStackTest extends TestCase
{
    use RefreshDatabase, WithFaker, DatabaseMigrations;
    protected $endPoint = '/endpoint';

    public function test_unit_type_note_added_successfully()
    {
        $this->signIn();
        $this->withoutExceptionHandling();
        $unitType = UnitType::factory()->create();
        $note = $this->faker()->sentence(3);
        $resp = $this->ajaxPost($this->admin_route.$this->endPoint."/".$unitType->property_version_id."/save-ut-note",[
            'notes' => [
                [
                    "ut_note_id" => "utn_".$unitType->id,
                    "note" => $note
                ]
            ]
        ])->assertStatus(Response::HTTP_OK);
        $results = [
            'notes'         => $note
        ];


        //i could print upto here
        dd('hit');

        $this->assertDatabaseHas(UnitType::class,$results);

        //but could not print here
        dd('hit');
        
    }
}

我正在使用 sqlite 进行测试,我正在使用 laravel 8(之前从 laravel 5 更新,以防万一确认)

我上面的代码,你可以看到我能看到的地方print hit

我正在使用.env.testing

DB_CONNECTION=sqlite
DB_DATABASE="database/test.sqlite"
DB_FOREIGN_KEYS=false

我已经在使用:use RefreshDatabase 但它仍然显示错误。完整的错误是:

Tests\Feature\FloorStackTest::test_unit_type_note_added_successfully
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: App\Models\UnitType (SQL: select count(*) as aggregate from "App\Models\UnitType" where ("notes" = Eveniet incidunt consequuntur dolore est.))

我的模型 UnitType 有这个

    use SoftDeletes, HasFactory;
    protected $table = 'unit_types';

    protected $guarded = ['id'];
    protected $dates = ['created_at','updated_at','deleted_at'];

首先,请注意将模型或完全限定的 class 名称传递给 assertDatabaseHas 方法仅从框架的版本 8 开始可用。请参阅下面的签名更改:

Signature in v7: protected $this assertDatabaseHas(string $table, array $data, string|null $connection = null).

Signature in v8: protected $this assertDatabaseHas(Model|string $table, array $data, string|null $connection = null).

最终,必须使用实际的 table 名称进行断言。这是文档中的演示方式:

$this->assertDatabaseHas('users', [
    'email' => 'sally@example.com',
]);

因此,如果您使用 Laravel <8,您可以传递 table 名称字符串以获得所需的结果:

$this->assertDatabaseHas('unit_types', $results);

作为替代方案,取自 this answer,您仍然可以使用模型 class 来获取 table 名称,而不是对字符串进行硬编码。

像这样:

$this->assertDatabaseHas((new UnitType)->getTable(), $results);

在Laravel 8方法中会取一个模型,而运行它通过这个方法得到table名字:

protected function getTable($table)
{
    return is_subclass_of($table, Model::class) ? (new $table)->getTable() : $table;
}

此处 table 可以是模型实例,或完全限定的 class 名称(new UnitType,或 UnitType::class)。请注意,它必须扩展基础 Model class 以便 Laravel 正确解析它,否则它只会将 class 名称字符串传递给查询。