Laravel 5 在测试之间重新播种数据库以进行单元测试

2024-03-20

我从一个种子数据库开始,并尝试在 Laravel 5 的单元测试之间重新种子数据库。在 Laravel 4 中,我知道您可以简单地使用 Illuminate\Support\Facades\Artisan 并运行命令

Artisan::call('migrate');
Artisan::call('db:seed');

或者你应该可以这样做:

$this->seed('DatabaseSeeder');

每次测试前。在 Laravel 5 中,这似乎已被替换为

use DatabaseMigrations;

or

use DatabaseTransactions;

我尝试过使用这些并成功地进行了迁移数据库的测试;但是,它实际上并没有重新播种表中的数据。我已经阅读了几个抱怨此问题的论坛,并尝试了几种不同的方法,从测试用例和每个测试中调用这些方法...添加

    $this->beforeApplicationDestroyed(function () {
        Artisan::call('migrate');
        Artisan::call('migrate:reset');
        Artisan::call('db:seed');
        DB::disconnect();
    });

到 TestCase.phptearDown()...

我也尝试过添加

$this->createApplication();

到 TestCase.php 中每个测试中调用的方法

有时它会把我的桌子完全抹掉。我在 Laravel 网站或博客中发现的任何内容似乎都不起作用。部分原因可能是因为我可能正在 Laravel 5 中尝试 Laravel 4 方法。在 Laravel 5 中有什么方法可以做到这一点吗?

我的 testcase.php 代码如下所示:

<?php

use Illuminate\Support\Facades\Artisan as Artisan;

class TestCase extends Illuminate\Foundation\Testing\TestCase{

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

    protected $baseUrl = 'http://localhost';


    public function initializeTests(){

        $this->createApplication();

       Artisan::call('migrate');
       $this->artisan('migrate');
       Artisan::call('db:seed');
       $this->artisan('db:seed');
       $this->seed('DatabaseSeeder');
       $this->session(['test' => 'session']);
       $this->seed('DatabaseSeeder');

    }

    public function tearDown()
    {
      Mockery::close();
      Artisan::call('migrate:reset');
      $this->artisan('migrate:reset');
      Artisan::call('migrate:rollback');
      $this->artisan('migrate:rollback');
      Artisan::call('migrate');
      $this->artisan('migrate');
      Artisan::call('db:seed');
      $this->artisan('db:seed');
      $this->seed('DatabaseSeeder');
      DB::disconnect();

         foreach (\DB::getConnections() as $connection) {
             $connection->disconnect();
         }

      $this->beforeApplicationDestroyed(function () {
         Artisan::call('migrate:reset');
         $this->artisan('migrate:reset');
         Artisan::call('migrate:rollback');
         $this->artisan('migrate:rollback');
         Artisan::call('migrate');
         $this->artisan('migrate');
         Artisan::call('db:seed');
         $this->artisan('db:seed');
         $this->seed('DatabaseSeeder');
         DB::disconnect();
         foreach (\DB::getConnections() as $connection) {
             $connection->disconnect();
         }
      });

       $this->flushSession();
       parent::tearDown();


    }

    public function getConnection()
    {
        $Connection = mysqli_connect($GLOBALS['DB_DSN'], $GLOBALS['DB_USERNAME'], $GLOBALS['DB_PASSWORD'], $GLOBALS['DB_DATABASE']);
        $this->createDefaultDBConnection();
        return $this->Connection;
    }

    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();

        return $app;
    }

    /**
     * Magic helper method to make running requests simpler.
     *
     * @param $method
     * @param $args
     * @return \Illuminate\Http\Response
     */
    public function __call($method, $args)
    {
        if (in_array($method, ['get', 'post', 'put', 'patch', 'delete']))
        {
            return $this->call($method, $args[0]);
        }

        throw new BadMethodCallException;
    }

    /**
     * Create a mock of a class as well as an instance.
     *
     * @param $class
     * @return \Mockery\MockInterface
     */
    public function mock($class)
    {
        $mock = Mockery::mock($class);

        $this->app->instance($class, $mock);

        return $mock;
    }

}

我的测试看起来像

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Artisan;

class CustomerRegistrationControllerTest extends TestCase
{

    use DatabaseMigrations;

    protected static $db_inited = false;

    protected static function initDB()
    {
        echo "\n---Customer Registration Controller Tests---\n"; // proof it only runs once per test TestCase class
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }

    public function setUp()
    {

        parent::setUp();

        if (!static::$db_inited) {
            static::$db_inited = true;
            static::initDB();
        }

//        $this->app->refreshApplication();
        $this->artisan('migrate:refresh');
        $this->seed();
        $this->seed('DatabaseSeeder');

        $this->initializeTests();

);

    }


    public function testSomething()

    {


        $this->Mock
            ->shouldReceive('destroy')
            ->with('1')
            ->andReturn();


        $this->RegistrationController->postRegistration();
//      $this->assertResponseStatus(200);

    }

}

只需运行这个:

    $this->artisan('migrate:refresh', [
        '--seed' => '1'
    ]);

为了避免在测试之间持续对数据库进行更改,请添加use DatabaseTransactions到您访问数据库的测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 5 在测试之间重新播种数据库以进行单元测试 的相关文章

  • 从数据库中删除重复的行

    我需要从数据库中删除重复的行 我可以用简单的sql查询来完成吗 如果没有 请告诉我一些快速算法来做到这一点 Example id field one field two 1 0000000 11111111 2 2222222 333333
  • 如何知道您的单元测试装置是否“尺寸合适”?

    您如何知道 测试夹具 的尺寸是否合适 我所说的 测试夹具 是指一个包含大量测试的类 我在测试装置中一直注意到的一件事是它们变得有点冗长 鉴于它们也可能不够详细 您如何了解单元测试的大小是否合适 我的假设是 至少在 Web 开发的背景下 您应
  • 在某些情况下如何告诉mock调用原始方法?

    我有一个类想要在稍后的测试中进行模拟 class Original function calculate a in test mock this gt getMock Original calculate mock gt expcets t
  • 时间序列数据的键值存储?

    我一直在使用 SQL Server 存储数十万个对象的历史时间序列数据 每天观察大约 100 次 我发现查询 给我时间 t1 和时间 t2 之间对象 XYZ 的所有值 太慢 对于我的需要 慢超过一秒 我按时间戳和对象 ID 建立索引 我考虑
  • PostgreSQL 中字符串列类型的索引数组

    是否可以在类型为的列上创建索引文本数组 尝试使用GIN索引 但查询似乎没有使用这些索引 Example CREATE TABLE users name VARCHAR 100 groups TEXT Query SELECT name FR
  • 什么时候不应该使用 Cassandra? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 相关话题已经有很多讨论了卡桑德拉 http cassandra apache org lately Twitter Digg Facebook
  • 使用 Greasemonkey 时存储数据

    使用 Greasemonkey 时是否有存储大量数据的好方法GM setValue只是没有削减它 那么这里有一些选项 设置服务器来保存数据 对于用户 并使用 xhr 来 创建 编辑 删除数据 谷歌应用程序 发动机 GAE http code
  • CloudKit 通过 cron 作业发送推送通知?

    我正在创建一个大学餐饮菜单应用程序 在其中我需要根据每日菜单发送推送通知 最初 我计划通过 Heroku 将用户数据存储在数据库中 并使用 cron 作业将数据库中的数据与每日菜单进行比较 并向用户发送适当的通知 然而 在 Cloudkit
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 如何运行传递给模拟方法的 lambda 函数?

    我想知道是否可以运行作为参数传递给模拟函数的 lambda 函数 并在调用模拟方法时运行它 我正在使用 Mockk 我想象代码是这样的 class DataManager fun submit lambda Int gt Unit val
  • Moq - 如何对方法中引用的更改进行单元测试

    另一天 另一个问题 我的服务层有以下方法 public MatchViewData CreateMatch string user var matchViewData HasReachedMaxNumberOfMatchesLimit us
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 使用 typescript、karma 和 jasmine 进行 RxJS Observable.timer 单元测试

    大家好 我对 Angular2 Karma 和 Jasmine 还比较陌生 目前我正在使用 Angular 2 RC4 Jasmine 2 4 x 我有一个 Angular 2 服务 它定期调用 http 服务 如下所示 getDataFr
  • Xcode 异步单元测试在主线程上等待

    我正在尝试使用 Xcode 中的单元测试来测试一些异步代码 但主线程被阻塞 问题在于 某些正在测试的代码期望从 iOS 类 AVFoundation 接收回调 但是 AVFoundation 类似乎只会在主线程上回调 问题是 如果我正在进行
  • PHPUnit - 模拟 S3Client 无法正常工作

    库 aws aws sdk php 2 PHP 版本 PHP 5 4 24 cli 作曲家 json require php gt 5 3 1 aws aws sdk php 2 require dev phpunit phpunit 4

随机推荐