【问题标题】:PHPUnit always run setUpDatabase every test methodPHPUnit 总是在每个测试方法中运行 setUpDatabase
【发布时间】: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 (id int unsigned not null auto_increment 主键, title varchar(255) 不为空,content 文本不为空,options blob 空))

我尝试在两个类上添加use RefreshDatabase;,但仍然返回相同的错误。

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

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

【问题讨论】:

  • @miken32 抱歉,您删除我的完整代码链接以及我的最后一个问题的原因是什么?我在回滚
  • 为什么要手动创建表,而不仅仅是在迁移中使用 RefreshDatabase 特征。我希望这会引发错误,因为 setUp 方法在每个测试上运行,但您不会在测试后删除表。
  • @Unflux 通常在 Laravel App 项目中我总是使用迁移,因为这只是一个简单的包所以我认为不需要迁移。实际上,它的灵感来自spatie 的大多数软件包,总是在测试中创建新表。 laravel-backup 的示例,它还在 setUpDatabase 上创建了一个表。但是 spatie 只使用 sqllite 而我使用 mariadb。可能是因为我使用了 mariadb 而出错。

标签: php laravel unit-testing phpunit


【解决方案1】:

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

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

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

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

也许这不是最佳做法,但也不是最差的做法。我看到的大多数 git repo 都在做这样的事情。所以我认为在我的 repo/package 中也需要这样做。

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2014-11-23
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多