Laravel 4 unittest使用错误的数据库

时间:2015-07-07 21:25:53

标签: php laravel laravel-4 phpunit

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

return array(

    'default' => 'sqlite',

    'connections' => array(
        'sqlite' => array(
            'driver'   => 'sqlite',
            'database' => ':memory:',
            'prefix'   => ''
        ),
    )
);

当我在setUp函数中初始化我的数据库时,这一切看起来都可以正常工作:

Mail::pretend(true);
Artisan::call('migrate');

$this->seed();

直接在我的测试中直接在我的测试类中的任何查询返回我期望的但是如果我在我的模型上调用一个函数来对数据库执行任何操作它使用我的'live'(我在一个vagrant dev中运行它服务器所以没有破坏任何东西的风险)数据库而不是我的测试。我是否需要进一步更改配置以确保它使用我的测试数据库?或者我需要以特殊方式实例化我的模型吗?

不起作用的一个例子。在我的测试中:

// gets the correct company
$comp = Companies::find(1);
// gets results from wrong database
$comp->quotesAndOrders();

其中quotesAndOrders对hasMany关系(订单)执行简单查询

$this->orders()->get();

2 个答案:

答案 0 :(得分:0)

首先,在我们的.env文件中,我们必须添加一个新变量。 看起来像这样。

DB_CONNECTION=sqlite

由于.rav文件中没有此变量,因为Laravel默认使用MySQL:

请看这里..

'default' => env('DB_CONNECTION', 'mysql')

现在我们的应用程序指向我们的sqlite数据库,现在我们可以运行migrationsseeding。之后,如果您只想继续运行MySQL从.env文件中删除DB_CONNECTION=sqlite

现在,在您的根文件夹中,您有一个phpunit.xml文件,在<php>节点

下打开它和一个新变量
<env name="DB_CONNECTION" value="sqlite"/>

答案 1 :(得分:0)

This project is based on someone elses code originally. In my companies model (annoyingly no other class and this was the first one I tested otherwise I would have spotted it sooner) there is an explicit definition to use the mysql database. I'm not sure why this was. I have removed that line and it now works.