如何对Laravel应用程序进行单元测试而无法迁移表,因为迁移是由另一个应用程序处理的

时间:2018-09-30 01:33:56

标签: ruby-on-rails postgresql unit-testing laravel-5

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

我的问题是使用此设置,什么是对laravel项目进行单元测试的最佳方法?当前,所有现有的单元测试都已损坏,因为它们都使用

保存到了数据库中。
use DatabaseMigrations;

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

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

由于如果postgres测试数据库已经随表一起迁移(通过迁移测试DB的rails应用程序),我仍然可以运行命中该数据库的单元测试,是否有办法在运行单元测试后清空该数据库< em>没有可以删除和迁移表吗?我可以以某种方式使用事务并回滚我在特定单元测试中完成的所有事务吗?

谢谢

1 个答案:

答案 0 :(得分:0)

所以我相信我已经解决了。我对使用事务而不是对单元测试进行迁移有一个正确的想法。

在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
 }