Laravel 在使用备用连接进行测试时找不到我的表

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

我在 Laravel 中有一个应用程序,需要使用不同的连接。我的模型用户需要常规的“mysql”连接,而相关模型(我们称之为“

HBSPT_COMPANIES
”)需要“
snowflake
”连接。在测试之前,与这两个连接交互时我没有任何问题。关于迁移,我有 mysql 的迁移,但没有雪花连接的迁移,因为那是一个外部数据源。

测试时,我将常规 mysql 连接替换为内存中的简单 sqlite 连接,我使用

RefreshDatabase
特征来运行 mysql 连接的迁移,但我有一个
snowflake_testing.sqlite
文件,应该使用它来代替雪花连接有一些测试数据。

我的问题是,当尝试在测试中获取数据时,我得到:

SQLSTATE[HY000]: General error: 1 no such table: HBSPT_COMPANIES (Connection: snowflake_testing, SQL: select * from "HBSPT_COMPANIES" where "name" = TEST_STUDENT)

我的

.env.testing
是这样的:

...
APP_ENV=testing

DB_CONNECTION=sqlite
DB_DATABASE=:memory:

SNOWFLAKE_DB_CONNECTION=snowflake_testing
SNOWFLAKE_DB_DATABASE=/path/to/file/database/snowflake_testing.sqlite
...

并在我的

config/database.php
中添加了以下配置

'snowflake_testing' => [
    'driver' => 'sqlite',
    'database' => env('SNOWFLAKE_DB_DATABASE'),
    'prefix' => '',
    'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],

这是我的测试:

use Tests\TestCase;


class ReportPolicyTest extends TestCase
{

    use RefreshDatabase;

    #[Test]
    public function it_allows_a_student_to_see_the_student_report(): void
    {

        $activeSchool = HubspotCompany::query()
            ->where('name', 'TEST_STUDENT')->get();

这是我的

HubspotCompany
模型:

class HubspotCompany extends Model
{

    use HasFactory;
    .
    .
    .
    protected $primaryKey = 'HS_OBJECT_ID';

    public $incrementing = false;

    protected $table = 'HBSPT_COMPANIES';


    public function __construct(array $attributes = array())
    {

        parent::__construct($attributes);

        $connection = config('app.env') !== 'testing' ? 'snowflake' : 'snowflake_testing';

        $this->setConnection($connection);

    }

不幸的是,我在 Google 中找到的每个资源都讨论了如何将 sqlite 设置为将使用 RefreshDatabase 特征重写的主数据库连接,我找不到任何有关已为 phpunit 和 Laravel 生成的虚拟数据的信息

显然,我尝试使用此查询检查我的

snowflake_testing.sqlite
是否确实具有该表和其中的一些数据:

select *
from HBSPT_COMPANIES
where "name" = "TEST_STUDENT" limit 1

我得到了预期的数据:

Image showing that I got the expected results

我尝试调整命名和连接,但似乎已经按顺序进行了。

php laravel sqlite phpunit laravel-10
1个回答
0
投票

您还必须在 phpunit.xml 中设置环境变量值,然后清除缓存。

<server name="APP_ENV" value="testing"/>

顺便说一句,我觉得在 Eloquent 模型中添加一些逻辑来选择正确的连接很奇怪,我认为你可以删除这些部分。

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