`RefreshDatabase` 删除所有表

问题描述 投票:0回答:3

在 Laravel/PHPunit 测试类中,我向类中添加了

use RefreshDatabase
,我理解这应该能够在测试完成时恢复测试期间对数据库的更改。

但是每当我在类中运行测试时,数据库中的所有表都会被删除,并且测试失败(因为这些表不存在!)。

文档建议让数据库在测试后恢复就像像我一样添加一行一样简单,我是否遗漏了一些东西?

database laravel testing phpunit
3个回答
19
投票

如果您不想使用 RefreshDatabase 擦除并重建数据库,则可以简单地使用 DatabaseTransactions 特征。 这将回滚测试期间所做的任何更改。

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    use DatabaseTransactions;

    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

0
投票

更新您的

phpunit.xml
并添加以下 2 行

<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>

0
投票

TL;DR 您想使用不同的数据库进行测试。正确的方法是使用一个

.env.testing
文件来复制现有
.env
文件中的所有环境变量。确保创建一个新的本地数据库,然后更新新文件中的
DB_DATABASE
环境变量。

RefreshDatabase
特征可能是测试中最常用的特征。它在每次测试运行之前运行迁移,并将每个单独的测试方法包装在一个事务中,以便在测试完成时回滚。

当您运行测试时,Laravel 会自动将应用程序环境设置为“测试”(相当于

app()->environment('testing')
),这就是为什么它会在
.env.testing
文件中查找环境变量。 您也可能不需要复制所有环境变量,但如果您正在运行 Jetstream 提供的测试,您至少需要将
APP_KEY
复制到
.env.testing
文件。

© www.soinside.com 2019 - 2024. All rights reserved.