【发布时间】:2021-05-16 16:48:03
【问题描述】:
我只是想为my laravel package 添加PHPUnit 测试,但我不知道为什么TestCase 中的setUpDatabase() 总是运行从TestCase 类扩展的每个测试。
这是我的TestCase 课程:
class TestCase extends BaseTestCase
{
protected function setUp(): void
{
parent::setUp();
$this->setUpDatabase();
}
protected function setUpDatabase()
{
$this->app['db']->connection()->getSchemaBuilder()->create(
'pages',
function(Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('content');
$table->binary('options')->nullable();
}
);
}
}
这是我的PageModelTest 课程:
class PageModelTest extends TestCase
{
public function setUp(): void
{
parent::setUp();
}
/** @test */
public function it_tests_right_row_count()
{
$pages = Page::all();
$this->assertCount(3, $pages);
}
/** @test */
public function it_tests_get_dynamic_column_data()
{
$page = Page::find(1);
$this->assertIsArray($page->options);
}
/** @test */
public function it_tests_create_data()
{
$pages = Page::create(
[
'title' => "Another title dynamic column",
'content' => 'This is another page content ',
'options' => ['author' => 'Anonimous', 'okay'],
]
);
$this->assertCount(4, $pages);
}
}
每个PageModelTest 方法运行也会一次又一次地运行setUpDatabase()。使第一个方法it_tests_right_row_count 成功,但其他方法返回错误,如下所示:
Halalsoft\LaravelDynamicColumn\Tests\PageModelTest::it_tests_get_dynamic_column_data Illuminate\Database\QueryException: SQLSTATE[42S01]: 基表或 视图已存在:1050 表“页面”已存在(SQL:创建 表
pages(idint unsigned not null auto_increment 主键,titlevarchar(255) 不为空,content文本不为空,optionsblob 空))
我尝试在两个类上添加use RefreshDatabase;,但仍然返回相同的错误。
我知道我可以检查setUpDatabase() 上是否存在该表,但我认为这不是一个好习惯。
这是正常行为还是我的代码有什么问题?
【问题讨论】:
-
@miken32 抱歉,您删除我的完整代码链接以及我的最后一个问题的原因是什么?我在回滚
-
为什么要手动创建表,而不仅仅是在迁移中使用 RefreshDatabase 特征。我希望这会引发错误,因为 setUp 方法在每个测试上运行,但您不会在测试后删除表。
-
@Unflux 通常在 Laravel App 项目中我总是使用迁移,因为这只是一个简单的包所以我认为不需要迁移。实际上,它的灵感来自spatie 的大多数软件包,总是在测试中创建新表。 laravel-backup 的示例,它还在
setUpDatabase上创建了一个表。但是 spatie 只使用 sqllite 而我使用 mariadb。可能是因为我使用了 mariadb 而出错。
标签: php laravel unit-testing phpunit