首页 > 解决方案 > 由于迁移由另一个应用程序处理,如何在无法迁移表的情况下对 Laravel 应用程序进行单元测试

问题描述

我最近指出一个现有的 laravel 项目使用新的 postgres 数据库。新的 postgres 数据库由为其执行所有迁移的 Rails API 应用程序维护。

我的问题是这个设置,单元测试 laravel 项目的最佳方法是什么。目前所有现有的单元测试都被破坏了,因为它们都使用

use DatabaseMigrations;

Laravel 应用程序将不再进行迁移,但仍直接访问数据库,并且当前不通过 Rails api 访问数据。

我应该在单元测试中模拟数据库请求吗?

或者

因为如果 postgres 测试数据库已经与表一起迁移(通过 rails 应用程序迁移测试数据库),我仍然可以运行命中数据库的单元测试,有没有办法在运行单元测试后清空数据库而没有能力下降并迁移表?我可以以某种方式使用事务并回滚我在特定单元测试中完成的所有事务吗?

谢谢

标签: postgresqlunit-testinglaravel-5

解决方案


所以我相信我已经想通了。我有使用 Transactions 而不是 Migrations 进行单元测试的正确想法。

在 Laravel 测试类中,而不是使用

use DatabaseMigrations;

您可以使用

use DatabaseTransactions;

这将使用数据库中的当前表。就我而言,我指出我的测试使用我已经为测试设置的名为“my_project_test”的特定数据库(假设常规应用程序数据库将被称为“my_project”),其中我已经迁移/创建了表。测试完成后,它将“回滚”/还原您从数据库中插入或删除的任何数据,以使其恢复到以前的状态。如果您使用 DatabaseMigrations 或 DatabaseTranactions,则断言的行为应该相同。只需确保您的测试数据库完全更新到其迁移。

类的示例......

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Routing\Route;

class UserControllerTest extends TestCase
{   
    //Instead of DatabaseMigrations use DatabaseTransactions instead.
    //use DatabaseMigrations; 
    use DatabaseTransactions;

   ... unit tests for class
 }

推荐阅读