我在 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
我得到了预期的数据:
我尝试调整命名和连接,但似乎已经按顺序进行了。
您还必须在 phpunit.xml 中设置环境变量值,然后清除缓存。
<server name="APP_ENV" value="testing"/>
顺便说一句,我觉得在 Eloquent 模型中添加一些逻辑来选择正确的连接很奇怪,我认为你可以删除这些部分。