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

PHPUnit 似乎没有运行 Laravel 迁移

如何使用内存数据库中的 sqlite 在 laravel 5.5 中运行单元测试

Laravel phpunit多个数据库测试没有运行

Laravel phpunit 模拟模型第一个函数

将 phpunit 安装到 Laravel 4 站点