Laravel 4 PHPUnit Sqlite 数据库,每次测试前删除项目
Posted
技术标签:
【中文标题】Laravel 4 PHPUnit Sqlite 数据库,每次测试前删除项目【英文标题】:Laravel 4 PHPUnit Sqlite Database, delete items before every test 【发布时间】:2013-07-23 15:05:51 【问题描述】:我有一个配置了用于测试的 sqlite db 的 Laravel 4 应用程序。
我在工作台包中工作
我在 phpUnit 测试中测试我的模型时遇到问题,因为我在我的模型上定义了一些独特的属性。我从我扩展其他测试的基本测试类运行Artisan::call('migrate', array('--bench' => 'vendor/webshop'));
。
我认为这会运行数据库迁移,但我认为它不会删除数据库中的模型。
因为如果我这样做了
public function setUp()
parent::setUp();
$this->order = Order::create(array(
"uniquekey" = "123"
));
我收到一条错误消息,由于违反唯一键规则,无法插入模型。
每次测试前我应该如何清理数据库?
【问题讨论】:
我只是通过$this->order->forceDelete();
删除我的模型,但这并不是解决问题的真正方法
【参考方案1】:
您应该为测试目的定义环境。
实际上,Laravel 确实为您准备了一个 - 请注意您的 app/config
中的 testing
文件夹。
创建app/config/testing/database.php
(或修改,如果存在)并放置:
return array(
'default' => 'sqlite',
'connections' => array(
'sqlite' => array(
'driver' => 'sqlite',
'database' => ':memory:', // this will do the trick ;)
'prefix' => '',
),
),
);
当你运行测试时,Laravel 会自动将它的环境设置为“测试”——不需要玩这个。 SQLite 内存数据库是存储在 RAM 中的内存,因此速度很快 - 是的,测试也从空数据库开始。
【讨论】:
正如我在第一行中提到的那样,我已经在这样做了,但是我猜只为每个类而不是每个测试清除数据库 这里没有migrate:refresh
的选项:github.com/laravel/framework/issues/1267#issuecomment-21468659以上是关于Laravel 4 PHPUnit Sqlite 数据库,每次测试前删除项目的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel PHPUnit 测试中使用内存中的 SQLite