데이터베이스 테스트
- 각 테스트 후 데이터베이스 재설정
- 팩토리 상태
- 팩토리 콜백
- 모델 팩토리를 사용하여 모델 생성
- Association & Attribute Closure
- 사용 가능한 어설션 방법
데이터베이스 테스트
소개
Laravel은 다양한 작업을 수행하는 유용한 도구를 제공합니다. 데이터베이스 기반 애플리케이션을 더 쉽게 테스트할 수 있습니다. 먼저,
assertDatabaseHas
도우미를 사용하여 데이터베이스에 있는 데이터가 주어진 조건 집합과 일치하는지 확인할 수 있습니다. 예를 들어,users
테이블의 레코드에sally @ example.com
에 대한email
값이 있는지 확인하려면 다음을 수행합니다. 다음:assertDatabaseHas
帮助程序断言数据库中存在的数据与给定的一组条件匹配。 例如,如果您要验证users
表中的记录是否具有sally @ example.com
的email
值,您可以执行以下操作:public function testDatabase(){ // Make call to application... $this->assertDatabaseHas('users', [ 'email' => 'sally@example.com' ]); }
您还可以使用
assertDatabaseMissing
帮助程序断言数据库中不存在数据。assertDatabaseHas
方法和其他类似的帮助程序是为了方便起见。 您可以自由使用任何 PHPUnit 的内置断言方法来补充您的测试。生成模型工厂
使用
make:factory
Artisan command 命令可以创建一个模型工厂:php artisan make:factory PostFactory
新生成的工厂位置在
database/factories
目录下。--model
选项可用于指示工厂创建的模型的名称。 此选项将使用给定模型预填充生成的工厂文件:php artisan make:factory PostFactory --model=Post
每次测试后重置数据库
在每次测试后重置数据库通常很有用,这样前一次测试的数据不会干扰后续测试。
RefreshDatabase
特征采用最优化的方法来迁移测试数据库,具体取决于您使用的是内存数据库还是传统数据库。 在测试类上使用特征,一切都将为您处理:<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; class ExampleTest extends TestCase{ use RefreshDatabase; /** * 一个基本功能测试示例 * * @return void */ public function testBasicExample() { $response = $this->get('/'); // ... } }
创建模型工厂
测试时,您可能需要在执行测试之前将几条记录插入数据库。 在创建此测试数据时, Laravel 不是手动指定每列的值,而是允许您使用模型工厂为每个 Eloquent 模型 定义一组默认属性。 开始测试前,请查看应用程序中的
database / factories / UserFactory.php
use Illuminate\Support\Str; use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => 'y$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => Str::random(10), ]; });
assertDatabaseMissing
도우미를 사용하여 데이터베이스에 데이터가 존재하지 않는다고 주장할 수도 있습니다. 🎜🎜assertDatabaseHas
메서드 및 기타 유사한 도우미는 편의를 위한 것입니다. 테스트를 보완하기 위해 PHPUnit에 내장된 어설션 메서드를 자유롭게 사용할 수 있습니다. 🎜🎜🎜🎜🎜모델 팩토리 생성🎜🎜make:factory
Artisan 명령을 사용하여 모델 팩토리를 생성하세요: 🎜$factory->state(App\User::class, 'delinquent', [ 'account_status' => 'delinquent', ]);
🎜새로 생성된 팩토리의 위치 < code>데이터베이스/팩토리 디렉토리입니다. 🎜🎜--model
옵션은 공장에서 생성된 모델의 이름을 나타내는 데 사용할 수 있습니다. 이 옵션은 생성된 팩토리 파일을 지정된 모델로 미리 채웁니다. 🎜$factory->state(App\User::class, 'address', function ($faker) { return [ 'address' => $faker->address, ]; });
🎜🎜🎜🎜각 테스트 후에 데이터베이스를 재설정🎜🎜 종종 이전 테스트의 데이터가 후속 테스트를 방해하지 않도록 테스트 후 데이터베이스를 재설정하는 데 유용합니다.RefreshDatabase
기능은 메모리 내 데이터베이스를 사용하는지 기존 데이터베이스를 사용하는지에 따라 테스트 데이터베이스 마이그레이션에 최적화된 접근 방식을 취합니다. 테스트 클래스에 특성을 사용하면 모든 것이 자동으로 처리됩니다. 🎜$factory->afterMaking(App\User::class, function ($user, $faker) { // ... }); $factory->afterCreating(App\User::class, function ($user, $faker) { $user->accounts()->save(factory(App\Account::class)->make()); });
🎜🎜🎜🎜모델 팩토리 만들기 🎜🎜테스트하는 동안 실행하기 전에 몇 가지 레코드를 삽입해야 할 수도 있습니다. 테스트 데이터베이스. 이 테스트 데이터를 생성할 때 각 열의 값을 수동으로 지정하는 대신 Laravel을 사용하면 모델 팩토리를 사용하여 각 Eloquent 모델에 대한 기본 속성 집합을 정의할 수 있습니다. 테스트를 시작하기 전에 애플리케이션에서database /factory/UserFactory.php
파일을 검토하세요. 기본적으로 이 파일에는 공장 정의가 포함되어 있습니다. 🎜$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) { // ... }); $factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) { // ... });
팩토리 정의로 사용되는 클로저에서는 모델의 모든 속성에 대한 기본 테스트 값을 반환할 수 있습니다. Closure는 테스트를 위한 다양한 무작위 데이터를 편리하게 생성할 수 있는 Faker PHP 라이브러리의 인스턴스를 받게 됩니다.
더 나은 구성을 위해 각 모델에 대한 추가 공장 파일을 생성할 수도 있습니다. 예를 들어
database/factories
디렉터리에UserFactory.php
및CommentFactory.php
파일을 생성할 수 있습니다.factories
디렉터리의 모든 파일은 Laravel에 의해 자동으로 로드됩니다.database / factories
目录中创建UserFactory.php
和CommentFactory.php
文件。factories
目录中的所有文件都将由 Laravel 自动加载。您可以通过在
config / app.php
配置文件中添加faker_locale
选项来设置 Faker 的语言环境。工厂状态
States 允许您定义可以任意组合应用于模型工厂的离散修改。 例如,您的
User
模型可能具有deinquent
状态,可以修改其默认属性值之一。 您可以使用state
方法定义状态转换。 对于简单状态,您可以传递一组属性修改:public function testDatabase(){ $user = factory(App\User::class)->make(); //在测试中使用模型... }
如果你的状态需要计算或
$ faker
实例,你可以使用 Closure 来计算状态的属性修改://创建三个 App\User 实例... $users = factory(App\User::class, 3)->make();
工厂回调
使用
afterMaking
和afterCreating
方法注册工厂回调,并允许您在创建或创建模型后执行其他任务。 例如,您可以使用回调将其他模型与创建的模型相关联:$users = factory(App\User::class, 5)->states('delinquent')->make(); $users = factory(App\User::class, 5)->states('premium', 'delinquent')->make();
您还可以为 工厂状态 定义回调:
$user = factory(App\User::class)->make([ 'name' => 'Abigail', ]);
使用模型工厂
创建模型
模型工厂定义后,就可以在测试或种子文件中使用全局
factory
函数来生成模型实例。 那么,让我们来看一些创建模型的例子。 首先,我们将使用make
方法创建模型,但不将它们保存到数据库中:public function testDatabase(){ // 创建单个 App\User 实例... $user = factory(App\User::class)->create(); // 创建3个 App\User 实例.. $users = factory(App\User::class, 3)->create(); // 在测试中使用模型... }
您还可以创建许多模型的集合或创建给定类型的模型:
$user = factory(App\User::class)->create([ 'name' => 'Abigail', ]);
应用状态
您也可以将任何 states 应用于模型。 如果要将多个状态转换应用于模型,则应指定要应用的每个状态的名称:
$users = factory(App\User::class, 3) ->create() ->each(function ($user) { $user->posts()->save(factory(App\Post::class)->make()); });
覆盖属性
如果要覆盖模型的某些默认值,可以将一组值传递给
make
方法。 只有指定的值才会被替换,而其余值仍然设置为工厂指定的默认值:$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { return factory(App\User::class)->create()->id; } ]; });
持久化模型
create
方法不仅创建了模型实例,还使用 Eloquent 的save
方法将它们保存到数据库中:$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { return factory(App\User::class)->create()->id; }, 'user_type' => function (array $post) { return App\User::find($post['user_id'])->type; } ]; });
您可以通过将数组传递给
create
config/app.php
구성 파일에faker_locale
옵션을 추가하여 Faker의 로케일을 설정할 수 있습니다.팩토리 상태
🎜상태를 사용하면 어떤 조합으로든 모델 팩토리에 적용할 수 있는 개별 수정 사항을 정의할 수 있습니다. 예를 들어,User
모델에는 기본 속성 값 중 하나를 수정할 수 있는deinquent
상태가 있을 수 있습니다.state
메서드를 사용하여 상태 전환을 정의할 수 있습니다. 간단한 상태의 경우 속성 수정 세트를 전달할 수 있습니다: 🎜rrreee🎜 상태에 계산이나$ faker
인스턴스가 필요한 경우 클로저를 사용하여 상태의 속성 수정을 계산할 수 있습니다. 🎜rrreee🎜🎜🎜팩토리 콜백
🎜afterMaking
및afterCreating
메서드를 사용하여 팩토리 콜백을 등록하고 생성하거나 생성할 수 있습니다. 모델 그런 다음 다른 작업을 수행합니다. 예를 들어, 콜백을 사용하여 다른 모델을 생성된 모델과 연결할 수 있습니다: 🎜rrreee🎜 공장 상태에 대한 콜백을 정의할 수도 있습니다: 🎜rrreee🎜🎜🎜모델 팩토리 사용< /h2>🎜🎜🎜
모델 만들기
🎜모델 팩토리가 정의된 후 테스트에서 전역팩토리
기능을 사용할 수 있습니다. 또는 모델 인스턴스를 생성하기 위한 시드 파일입니다. 이제 모델 생성의 몇 가지 예를 살펴보겠습니다. 먼저make
메소드를 사용하여 모델을 데이터베이스에 저장하지 않고 생성합니다: 🎜rrreee🎜 또한 여러 모델의 컬렉션을 생성하거나 특정 유형의 모델을 생성할 수도 있습니다: 🎜rrreee상태 적용
🎜모든 상태를 모델에 적용할 수도 있습니다. 모델에 여러 상태 전환을 적용하려면 적용할 각 상태의 이름을 지정해야 합니다. 🎜rrreee속성 재정의
🎜 모델의 기본값 중 일부를 재정의하려면 다음을 수행하세요.make
메소드에 전달된 값 세트를 추가합니다. 지정된 값만 교체되고 나머지 값은 여전히 공장에서 지정된 기본값으로 설정됩니다. 🎜rrreee🎜🎜🎜지속 모델
🎜create
메소드는 모델 인스턴스를 생성할 뿐만 아니라 Eloquent의save
메소드를 사용하여 이를 데이터베이스에 저장합니다: 🎜rrreee🎜<에 배열을 전달하여 이를 수행할 수 있습니다. code>create 모델의 속성을 재정의하는 메서드: 🎜rrreee🎜🎜🎜🎜관계
이 예에서는 모델을 생성하는 몇 가지 관계를 연결합니다. 여러 모델을 생성하기 위해
rrreeecreate
메소드를 사용할 때 Eloquent 컬렉션 인스턴스가 반환되므로 각각과 같은 편의 메소드를 컬렉션에서 사용할 수 있습니다:Association & Attribute Closure h4>
create
方法创建多个模型时,返回一个 Eloquent 集合实例 ,这样就可以在集合上使用 each 等便利方法:rrreee关联 & 属性闭包
您还可以使用工厂定义中的 Closure 属性将关系附加到模型。 例如,如果您想在创建
rrreeePost
时创建一个新的User
实例,您可以执行以下操作:这些闭包接收一个包含工厂属性的数组:
rrreee可用的断言方法
Laravel 为 PHPUnit 测试提供了多个数据库断言方法:
方法 描述 $this->assertDatabaseHas($table, array $data);
断言数据库表中包含给定的数据。 $this->assertDatabaseMissing($table, array $data);
断言数据库表中不包含给定的数据。 Laravel은 PHPUnit 테스트는 여러 데이터베이스 어설션 메서드를 제공합니다: 이러한 클로저는 포함된 팩토리 속성을 받습니다. 배열:rrreee$this->assertSoftDeleted($table, array $data);
공장 정의의 Closure 속성을 사용하여 모델에 관계를 연결할 수도 있습니다. 예를 들어,Post
를 생성할 때 새로운User
인스턴스를 생성하려는 경우 다음을 수행할 수 있습니다:rrreee사용 가능한 어설션 방법
thead>< tbody>방법 설명 $this->assertDatabaseHas($table, array $data) ; code>
$this->assertDatabaseMissing($table, array $data); code>🎜데이터베이스 테이블에 주어진 데이터가 포함되어 있지 않은지 확인합니다. 🎜🎜
$this->assertSoftDeleted($table, array $data); code>🎜🎜데이터베이스의 지정된 레코드가 일시 삭제되었음을 확인합니다. 🎜🎜🎜🎜🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜
- 모델 팩토리 생성