PHPUnit always 运行 setUpDatabase every 测试方法

PHPUnit always run setUpDatabase every test method

我只是想为 my laravel package 添加 PHPUnit 测试,但我不知道为什么 setUpDatabase()TestCase 总是 运行 每个从 [= 扩展的测试14=] class.

这是我的 TestCase class:

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 :

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 成功但其他方法 return 错误如下:

Halalsoft\LaravelDynamicColumn\Tests\PageModelTest::it_tests_get_dynamic_column_data Illuminate\Database\QueryException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'pages' already exists (SQL: create table pages (id int unsigned not null auto_increment primary key, title varchar(255) not null, content text not null, options blob null))

我试图在两个 class 上添加 use RefreshDatabase; 但仍然 return 同样的错误。

我知道我可以检查 setUpDatabase() 上是否存在 table,但我认为这不是一个好习惯。

这是正常行为还是我的代码有问题?

我创建的测试用例实际上是从 Spatie 的大多数包中获得灵感的 总是在测试中创建新的 table。一个示例 laravel-backup,它还在 setUpDatabase 上创建了一个 table。但是我不知道 Spatie 是否在每个测试用例中都删除了数据库。这样我就可以回答我自己的问题了:

Its normal behavior or any wrong with my codes?

这是正常行为,我的代码没有错,但如果我不想创建 table 每个 运行 测试用例方法,则需要改进。

I know I can check if the table is exist on setUpDatabase() but I don't think it's good practice.

也许这不是最佳做法,但也不是最差的做法。我看到的大多数 git 回购都是这样做的。所以我认为我的 repo/package.

也需要这样做