我已经创建了一个测试数据库环境,如下所示:
return array(
'default' => 'sqlite',
'connections' => array(
'sqlite' => array(
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => ''
),
)
);
当我在setUp函数中初始化数据库时,这一切似乎都工作得很好:
Mail::pretend(true);
Artisan::call('migrate');
$this->seed();
直接在我的测试中直接在我的测试类中返回我所期望的,但是如果我在我的模型上调用一个函数,它使用我的"活"(我在一个流浪的开发服务器中运行这个,所以没有破坏任何东西的风险)数据库而不是我的测试一个。我是否需要进一步更改配置以确保它使用我的测试数据库?或者我需要以一种特殊的方式实例化我的模型吗?
一个行不通的例子。在我的测试:
// gets the correct company
$comp = Companies::find(1);
// gets results from wrong database
$comp->quotesAndOrders();
where quotesAndOrders对hasMany关系(orders)进行简单查询
$this->orders()->get();
首先,在我们的。env文件中,我们必须添加一个新变量。是这样的
DB_CONNECTION=sqlite
这是因为当.env文件中没有这个变量时,Laravel默认为MySQL:
看到…
'default' => env('DB_CONNECTION', 'mysql')
现在我们的应用程序指向我们的sqlite
数据库,我们现在可以运行我们的migrations
和seeding
。之后,如果您只是想继续运行MySQL
,请从.env文件中删除DB_CONNECTION=sqlite
。
现在在根目录下你有一个phpunit.xml
文件,打开它并在<php>
节点下新建一个变量
<env name="DB_CONNECTION" value="sqlite"/>
这个项目最初是基于别人的代码。在我公司的模型中(恼人的是没有其他类,这是我测试的第一个类,否则我会更快地发现它)有一个明确的定义来使用mysql数据库。我不知道为什么会这样。我已经删除了这一行,现在它可以工作了