首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Larravel项目没有用于数据库的迁移脚本。`Illuminate\Foundation\Testing\RefreshDatabase`会处理吗?如何处理?

在 Laravel 项目中,Illuminate\Foundation\Testing\RefreshDatabase 是一个用于测试时重置数据库状态的特性。这个特性会自动回滚数据库事务,并重新运行数据库迁移脚本,以确保每次测试都在一个干净的数据库环境中执行。

如果你的 Laravel 项目中没有用于数据库的迁移脚本,RefreshDatabase 特性将无法正常工作,因为它依赖于迁移脚本来重建数据库结构。以下是处理这种情况的步骤:

1. 创建迁移脚本

首先,你需要为你的数据库表创建迁移脚本。你可以使用 Artisan 命令来创建迁移文件:

代码语言:txt
复制
php artisan make:migration create_your_table_table

这将在 database/migrations 目录下生成一个新的迁移文件。

2. 编写迁移脚本

打开新生成的迁移文件,并编写你的表结构。例如:

代码语言:txt
复制
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateYourTableTable extends Migration
{
    public function up()
    {
        Schema::create('your_table', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('your_table');
    }
}

3. 运行迁移

在本地开发环境中运行迁移,以确保数据库结构正确:

代码语言:txt
复制
php artisan migrate

4. 配置测试环境

确保你的 phpunit.xmljest.config.js 文件中配置了 RefreshDatabase 特性。例如,在 phpunit.xml 中,你可能需要有以下配置:

代码语言:txt
复制
<php>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value(":memory:"/>
</php>

<testsuites>
    <testsuite name="Feature">
        <directory suffix="Test.php">./tests/Feature</directory>
    </testsuite>
</testsuites>

<filter>
    <whitelist processUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">./app</directory>
    </whitelist>
</filter>

<listeners>
    <listener class="\Illuminate\Foundation\Testing\RefreshDatabase"/>
</listeners>

5. 编写测试用例

现在你可以编写测试用例,并利用 RefreshDatabase 特性来确保每次测试都在一个干净的数据库环境中执行。例如:

代码语言:txt
复制
namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class YourTableTest extends TestCase
{
    use RefreshDatabase;

    public function test_your_table_can_be_created()
    {
        // 测试逻辑
    }
}

总结

  • 基础概念RefreshDatabase 是 Laravel 提供的一个测试辅助工具,用于在每次测试后重置数据库状态。
  • 优势:确保测试之间的独立性,避免测试数据污染。
  • 类型:这是一个测试环境特性。
  • 应用场景:适用于所有需要数据库交互的单元测试和功能测试。
  • 问题原因:没有迁移脚本,RefreshDatabase 无法重建数据库结构。
  • 解决方法:创建并运行迁移脚本,配置测试环境以使用 RefreshDatabase

通过以上步骤,你应该能够解决 Laravel 项目中缺少数据库迁移脚本的问题,并正确利用 RefreshDatabase 特性进行测试。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

掌握 Laravel 的测试方法

我们会简单介绍 PHPUnit 「单元测试」和「功能测试」的基本使用方法。继而,讲解如何在 Laravel 项目中创建「单元测试」和「功能测试」用例。...搭建测试环境 创建测试模型 在开始创建测试用例前,我们需要先构建起用于测试的项目依赖。 先执行下面的 artisan 命令创建一个 Post 模型及其对应的迁移文件。...Post 数据表会存储一篇文章的标题。修改后 Post 数据库迁移文件代码如下: Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation...在 Laravel 项目中运行 PHPUnit 测试用例,仅需在项目更目录执行下面的命令。 $ phpunit 这个命令会运行项目中的所有测试用例。

5.7K10

【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用

架构 首先,应该了解larravel框架的架构模式(设计核心,larravel架构是使用服务组件化开发模式开发的,larravelframework由不同的服务组件组成) larravel中的多个服务提供商构成了...类->服务->组件 Larravel使用基于组件的开发模式,具有多个类->服务->组件,多个类构成服务,多个服务构成组件。 多个组件提供不同的服务,然后多个服务构成我们的项目。...由于它是中间件,它将在服务容器注册所有服务后执行,而控制器的构造函数在容器注册服务时执行,因此此时会话尚未启动。如何获取数据?...,这对许多应用程序来说都没有问题。...Larave可以处理多种类型的驱动程序: 文件–会话数据存储在存储/框架/会话目录中; Cookie–会话数据存储在已安全加密的Cookie中; 数据库–会话数据存储在数据库中 Memcached

3.6K10
  • Laravel 5.5 LTS 正式发布!

    实现接口的类可以从控制器方法返回。在准备响应到 Illuminate\Routing\Router 时,路由器会检查 Responsable 的实例。...=Example ExampleFactory migrate:fresh 迁移命令 5.5 中新的 migrate:fresh 迁移命令能让你在开发中轻松地创建一个干净数据库。...这条命令可以自动为你删除所有数据库表并且运行迁移。 这听起来很像 migrate:refresh 命令,它会回滚并重新迁移。但通常在开发过程中,你会更倾向于一口气删除所有表再来运行迁移。...而 migrate:fresh 做的正是这件事情。 RefreshDatabase Trait RefreshDatabase trait 是在测试期间迁移数据库的新方式。...根据你是否使用内存数据库或传统数据库,这会是迁移测试数据库的最佳方法。

    2.6K30

    Laravel 底层原理:门面(Facades)

    例如,下面这个 Facade 的调用和辅助函数的作用是一样的: return View::make('profile'); return view('profile'); 这里的 Facades 和辅助函数之间没有实际的区别...当用户调用 Cache Facade 中的任何静态方法时, Laravel 会从 服务容器 中解析 cache 绑定,然后在解析出的对象上调用所有的请求方法(本例中是 get)。...实时门面 使用实时门面,可以将应用中的任意类当做门面来使用。 为了说明如何使用这个功能,我们先看一个替代方案。...\Foundation\Testing\RefreshDatabase; class PodcastTest extends TestCase { use RefreshDatabase; /**...Facade 类 服务容器绑定 App Illuminate\Foundation\Application app Artisan Illuminate\Contracts\Console\Kernel

    1.4K10

    Laravel 底层原理:门面(Facades)

    例如,下面这个 Facade 的调用和辅助函数的作用是一样的: return View::make('profile'); return view('profile'); 这里的 Facades 和辅助函数之间没有实际的区别...当用户调用 Cache Facade 中的任何静态方法时, Laravel 会从 服务容器 中解析 cache 绑定,然后在解析出的对象上调用所有的请求方法(本例中是 get)。...实时门面 使用实时门面,可以将应用中的任意类当做门面来使用。 为了说明如何使用这个功能,我们先看一个替代方案。...\Foundation\Testing\RefreshDatabase; class PodcastTest extends TestCase { use RefreshDatabase; /**...Facade 类 服务容器绑定 App Illuminate\Foundation\Application app Artisan Illuminate\Contracts\Console\Kernel

    1.1K20

    写Laravel测试代码(1)

    这样会很大提高数据库测试的性能,因为可以在每一个test case里只需要指定本次测试所污染的数据表。...在tests/TestCase.php中可以在setUp()设置数据库重装操作: abstract class TestCase extends \Illuminate\Foundation\Testing...,不推荐使用Laravel给出的\Illuminate\Foundation\Testing\DatabaseMigrations 和 \Illuminate\Foundation\Testing\DatabaseTransactions...laravel的db:seed命令没有--tables这个options,所以需要扩展\Illuminate\Database\Console\Seeds\SeedCommand: class SeedCommand...以后写数据库测试性能会提高很多,大量的test case可以在短时间内运行完毕。 最后,写测试代码是必须的,好处非常多,随着项目程序越来越大,就会深深感觉到写测试是必须的,一劳永逸,值得花时间投资。

    69731

    3分钟短文:为了你少跳坑,Laravel写好了用户授权

    users数据表 用户的数据和信息必然在数据库内,所以laravel自带了User模型,在 app/User.php 文件内, 内部代码声明了必要的部分: namespace App; use Illuminate...\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends...,这个模型文件与我们之前介绍的 Model 模型差别非常大,因为其直接继承了 Illuminate\Foundation\Auth\User 类, 我们接着追溯该类的内容: class User extends...有了模型还没有数据库表,这个模型除了能处理逻辑,一点数据都拿不到。所以第一步我们要把数据库迁移完成。...来看一下默认的users表的迁移文件 2014_10_12_000000_create_users_table.php 的内容,还是我们之前无数次强调过的,先实现 up 方法用于迁移表格: public

    57820

    3分钟短文:为了你少跳坑,Laravel写好了用户授权

    users数据表 用户的数据和信息必然在数据库内,所以laravel自带了User模型,在 app/User.php 文件内, 内部代码声明了必要的部分: namespace App; use Illuminate...\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; ​ class User extends...,这个模型文件与我们之前介绍的 Model 模型差别非常大,因为其直接继承了 Illuminate\Foundation\Auth\User 类, 我们接着追溯该类的内容: class User extends...有了模型还没有数据库表,这个模型除了能处理逻辑,一点数据都拿不到。所以第一步我们要把数据库迁移完成。...来看一下默认的users表的迁移文件 2014_10_12_000000_create_users_table.php 的内容,还是我们之前无数次强调过的,先实现 up 方法用于迁移表格: public

    91800

    Laravel 6.14.0 版本发布,支持在响应发送后执行任务

    、连接关闭前执行某个任务,其实现原理有点类似终止中间件,会在应用程序处理请求完成之前注册一个可运行的终止回调到应用。...有人可能会说同样的事情可以通过队列任务来完成,确实如此,不过对于一些简单的、非耗时的、需要立即执行的任务,通过这种方式处理更简单一些。...事件 当没有任何数据库迁移执行时,现在可以触发一个 NoMigrations 事件,虽然通常我们可能并不会用到这个特性: // 在迁移类的 up 方法中如何没有任何迁移任务,可以这样触发 NoMigrations...新增特性 新增 Illuminate\Bus\Dispatcher::dispatchAfterResponse() 方法 新增 Illuminate\Support\Testing\Fakes\QueueFake...在 Illuminate\Bus\Queueable::middleware() 中没有合并方法和属性中的中间件 从 Illuminate\Console\Command 中分离 specifyParameter

    1.9K20

    Laravel源码解析之Console内核

    上一篇文章我们介绍了Laravel的HTTP内核,详细概述了网络请求从进入应用到应用处理完请求返回HTTP响应整个生命周期中HTTP内核是如何调动Laravel各个核心组件来完成任务的。...引导应用 在Console内核的 handle方法里我们可以看到和HTTP内核处理请求前使用 bootstrapper程序引用应用一样在开始处理命令任务之前也会有引导应用这一步操作 其父类 「Illuminate...通过命令名称查找命令类的命名空间和类名。 执行命令类的 run方法来完成任务处理并返回状态码。 和命令行脚本的规范一样,如果执行命令任务程序成功会返回0, 抛出异常退出则返回1。...还有就是打开命令类后我们可以看到并没有run方法,我们把处理逻辑都写在了 handle方法中,仔细查看代码会发现 run方法定义在父类中,在 run方法会中会调用子类中定义的 handle方法来完成任务处理...结束应用 执行完命令程序返回状态码后, 在 artisan中会直接通过 exit($status)函数输出状态码并结束PHP进程,接下来shell进程会根据返回的状态码是否为0来判断脚本命令是否执行成功

    1.8K20

    深度挖掘 Laravel 生命周期

    Laravel 框架或者说任何一个 Web 项目,我们都需要理解它究竟是如何接收到用户发起的 HTTP 请求的;又是如何响应结果给用户的;在处理请求和响应的过程中都存在哪些处理值得深入学习。...但是没有聊如何调用这些「引导程序」。 /** * Send the given request through the middleware / router....最终还是要看 Illuminate\Foundation\Application 的 bootstrapWith() 方法究竟如何来启动这些引导程序的。...有关 「管道」的相关知识不在本文讲解范围内。 那么,究竟一个请求是如何被处理的呢?...三 总结 在 「创建 Laravel 应用实例」时不仅会注册项目基础服务、注册项目服务提供者别名、注册目录路径等在内的一系列注册工作;还会绑定 HTTP 内核及 Console 内核到 APP 容器,

    7.4K20

    完善你的Laravel异常处理

    这篇文章我们来简单梳理一下Laravel中提供的异常处理能力,然后讲一些在开发中使用异常处理的实践,如何使用自定义异常、如何扩展Laravel的异常处理能力。...注册异常Handler 这里又要回到我们说过很多次的Kernel处理请求前的bootstrap阶段,在bootstrap阶段的 Illuminate\Foundation\Bootstrap\HandleExceptions...这样项目中所有的代码没有被正确执行时都能抛出异常实例了。...Illuminate\Database\Eloquent\ModelNotFoundException 通过模型的 findOrFail和 firstOrFail方法获取单条记录时如果没有找到会抛出这个异常...Laravel的处理HTTP请求不成功时抛出此异常 扩展Laravel的异常处理器 上面说了Laravel把 \App\Exceptions\Handler 注册成功了全局的异常处理器,代码中没有被

    2.8K20

    【Laravel系列7.2】错误与异常处理

    ,你会发现它只是调用了错误控制类的 report() 方法,在这里是使用容器获得的错误处理对象,实际上的对象是 vendor/laravel/framework/src/Illuminate/Foundation...现在主要的疑问是在于 Laravel 框架中是如何去捕获这些全局的异常和错误信息的,是使用我们熟悉的 set_error_handler()、set_exception_handler() 这些函数吗?...带着这个问题,我们就来剖析一下 Laravel 源码是如何处理这些情况的。.../src/Illuminate/Foundation/Http/Kernel.php 的启动加载数组里面就有一个 vendor/laravel/framework/src/Illuminate/Foundation...$app->environment('testing')) { ini_set('display_errors', 'Off'); } } 熟悉的配方,熟悉的味道,还需要我再多说什么吗

    2.8K20

    为什么 Laravel 这么优秀?

    所有和 Laravel 的交互包括操作队列,数据库迁移,生成模版文件等;你都可以通过这个脚本来完成,这也是官方推荐的最佳实践之一。...因为我们已经完成了数据表中字段的定义、表与表的关系、以及最重要的一步:如何将数据及数据之间的关系写入数据库中,下面简单的来介绍下在 Laravel 是如何完成的。...Laravel 会自动帮我们处理复杂的 Join 操作,还能在一定条件下帮我们处理如 N+1 问题。...::class); Laravel 会自动帮我们注册 5 条路由如下所示,包括用于新增操作的 POST 请求,用于删除的 DELETE 请求等: file Laravel 路由虽然是非常优秀的设计,...项目 Laravel Rails Django ORM 有 有 有 数据库迁移 有 有 有 发送邮件 Mailables 邮件 ActionMailer 梅勒 SendMail 接收邮件 无 Action

    26710

    Laravel API教程:如何构建和测试RESTful API

    您可以将资源表示在多个数据模型中(或根本不在数据库中表示),并且模型完全不受用户限制。最后,您将以适合您的应用程序的方式来决定如何构建资源和模型。...要记住的另一件事是,您不必为每个资源实施每个操作。 创建你的项目 与所有现代PHP框架一样,我们需要Composer来安装和处理我们的依赖关系。...迁移和模型(Migrations and Models) 在实际编写第一次迁移之前,请确保为此应用程序创建了一个数据库,并将其凭据添加到.env位于项目根目录中的文件中。...这样做,让我们继续迁移(migrate): $ php artisan migrate 您还可以使用 此处的--step 选项,并将每个迁移(migration )分成自己的批处理,以便您可以在需要时单独回滚...这是修改后的class: use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\

    20.4K20

    Laravel源码解析之ENV配置

    例如,你可能希望在本地使用测试的 Mysql数据库而在上线后希望项目能够自动切换到生产 Mysql数据库。本文将会详细介绍 env 文件的使用与源码的分析。...,比如在 www用户的 /home/www/.bashrc中添加 exportAPP_ENV dev 在部署项目的持续集成任务或者部署脚本里执行 cp.env.dev.env 针对前两种方法, Laravel...app.php 中使用 Application实例的 useEnvironmentPath方法: $app = new Illuminate\Foundation\Application( realpath...我们来看一下 \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables的源码来分析下 Laravel是怎么加载 env中的配置的。 项目中读取env配置 在Laravel应用程序中可以使用 env()函数去读取环境变量的值,比如获取数据库的HOST: env('DB_HOST`, 'localhost'); 传递给 env 函数的第二个值是

    2.1K20
    领券