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 名称字符串传递给查询。
我的测试:
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 名称字符串传递给查询。