测试错误:未找到基表或视图:1146 表“testing.users”不存在

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

我做了这个简单的测试:

public function test_my_awesome_test()
{
    $user = User::find(1);
    $response = $this->actingAs($user)->get('/awesome/test');

    $response->assertStatus(200);
}

但是运行测试后它显示错误:

SQLSTATE[42S02]:未找到基表或视图:1146 表 “testing.users”不存在(SQL:select * from

users
,其中
users
id
= 1 限制 1)

如果我需要从数据库打印一些数据,我也会遇到同样的错误。该表存在并且网站运行正常。谁知道问题出在哪里?

laravel unit-testing testing
3个回答
2
投票

根据 Laravel documentation,当您运行测试时,Sail 会覆盖您在

.env
文件中定义的数据库名称。您需要从
phpunit.xml
文件中删除以下行:

<env name="DB_DATABASE" value="testing"/>

0
投票

Laravel Sail 创建一个名为 testing 的专用数据库,以便您的测试与主数据库隔离,因此不会干扰其中的数据(来源:https://laravel.com/docs/11. x/sail#running-tests)。 Sail 还会修改项目中的 phpunit.xml 文件,以在运行测试时指向此 testing 数据库,通过添加这行代码...

<env name="DB_DATABASE" value="testing"/>

您报告的错误消息指出

Base table or view not found: 1146 Table 'testing.users' doesn't exist

如果您检查 testing 数据库(例如使用 MySQL Workbench),您将看到它是一个空数据库,这与您收到的错误消息一致,即

testing 中不存在 users 表数据库。事实上,您的主数据库中有一个 
users
表是无关紧要的,因为您的测试未设置为查看您的主数据库。

一个解决方案(已经给出)是从您的 phpunit.xml 文件中删除上述代码行。但是,我不会推荐这种方法,因为您的测试会污染您的主数据库,并且可能会无意中删除您想要保留的数据。

显然,如果 testing 数据库为空,则需要在测试运行之前运行迁移以创建适当的表。有用的是,PHPUnit 提供了一个

RefreshDatabase
特征,使用该特征时,如果尚未运行迁移,则会在您的
testing 数据库上调用 php artisan migrate:fresh

因此,

最佳解决方案是在测试用例中使用此

RefreshDatabase
特征,如Laravel文档中所述:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
    use RefreshDatabase;
 
    /**
     * A basic functional test example.
     */
    public function test_basic_example(): void
    {
        $response = $this->get('/');
 
        // ...
    }
}

-1
投票

在项目根目录中创建 .testing 文件,并在其中设置数据库连接配置,如 .env 文件。如果你运行测试,laravel 使用 .testing 而不是 .env 来读取环境

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