使用错误的数据库进行单元测试


Laravel 4 unittest using wrong database

我已经创建了一个测试数据库环境,如下所示:

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数据库,我们现在可以运行我们的migrationsseeding。之后,如果您只是想继续运行MySQL,请从.env文件中删除DB_CONNECTION=sqlite

现在在根目录下你有一个phpunit.xml文件,打开它并在<php>节点下新建一个变量

<env name="DB_CONNECTION" value="sqlite"/>

这个项目最初是基于别人的代码。在我公司的模型中(恼人的是没有其他类,这是我测试的第一个类,否则我会更快地发现它)有一个明确的定义来使用mysql数据库。我不知道为什么会这样。我已经删除了这一行,现在它可以工作了