Ujian pangkalan data
- Reset Database Setelah setiap ujian
- Create Model Factory
- Factory Status
- Factory Callback
- Create Model menggunakan kilang model
- Association & Atribute Closure
- Pengujian Pangkalan Data Pulangan kilang Laraskan
- Guna kilang model dalam ujian
- Cipta model
- Model kegigihan kaedah assertion
-
- Pengenalan
- Laravel menyediakan pelbagai alat berguna yang membuat menguji aplikasi berasaskan pangkalan data dengan lebih mudah. Mula-mula, anda boleh menggunakan pembantu
assertDatabaseHas
untuk menegaskan bahawa data yang terdapat dalam pangkalan data sepadan dengan set syarat yang diberikan. Sebagai contoh, jika anda ingin mengesahkan bahawa rekod dalam jadualpengguna
mempunyai nilaie-mel
untuksally @ example.com
, anda akan lakukan yang berikut:public function testDatabase(){ // Make call to application... $this->assertDatabaseHas('users', [ 'email' => 'sally@example.com' ]); }
Anda juga boleh menegaskan bahawa data tidak wujud dalam pangkalan data menggunakan pembantuassertDatabaseMissing
. - Kaedah
assertDatabaseHas
dan pembantu lain yang serupa adalah untuk kemudahan. Anda bebas menggunakan mana-mana kaedah penegasan terbina dalam PHPUnit untuk menambah ujian anda.
Menjana model kilang - Gunakan perintah
make:factory
Artisan untuk mencipta kilang model:php artisan make:factory PostFactory
Lokasi kilang yang baru dijana ialah direktori < code>pangkalan data/kilang. Pilihan
Tetapkan semula pangkalan data selepas setiap ujian--model boleh digunakan untuk menunjukkan nama model yang dibuat oleh kilang. Pilihan ini akan pra-isi fail kilang yang dijana dengan model yang diberikan: php artisan make:factory PostFactory --model=Post
assertDatabaseHas
帮助程序断言数据库中存在的数据与给定的一组条件匹配。 例如,如果您要验证users
表中的记录是否具有sally @ example.com
的email
值,您可以执行以下操作:<?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('/'); // ... } }
您还可以使用
assertDatabaseMissing
帮助程序断言数据库中不存在数据。assertDatabaseHas
方法和其他类似的帮助程序是为了方便起见。 您可以自由使用任何 PHPUnit 的内置断言方法来补充您的测试。生成模型工厂
使用
make:factory
Artisan command 命令可以创建一个模型工厂: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), ]; });
新生成的工厂位置在
database/factories
目录下。--model
选项可用于指示工厂创建的模型的名称。 此选项将使用给定模型预填充生成的工厂文件:$factory->state(App\User::class, 'delinquent', [ 'account_status' => 'delinquent', ]);
每次测试后重置数据库
在每次测试后重置数据库通常很有用,这样前一次测试的数据不会干扰后续测试。
RefreshDatabase
特征采用最优化的方法来迁移测试数据库,具体取决于您使用的是内存数据库还是传统数据库。 在测试类上使用特征,一切都将为您处理:$factory->state(App\User::class, 'address', function ($faker) { return [ 'address' => $faker->address, ]; });
创建模型工厂
测试时,您可能需要在执行测试之前将几条记录插入数据库。 在创建此测试数据时, Laravel 不是手动指定每列的值,而是允许您使用模型工厂为每个 Eloquent 模型 定义一组默认属性。 开始测试前,请查看应用程序中的
database / factories / UserFactory.php
Selalunya berguna untuk menetapkan semula pangkalan data selepas ujian supaya data daripada ujian sebelumnya tidak mengganggu ujian berikutnya. CiriRefreshDatabase
mengambil pendekatan yang dioptimumkan untuk memindahkan pangkalan data ujian, bergantung pada sama ada anda menggunakan pangkalan data dalam memori atau tradisional. Gunakan ciri pada kelas ujian anda dan semuanya akan diuruskan untuk anda:$factory->afterMaking(App\User::class, function ($user, $faker) { // ... }); $factory->afterCreating(App\User::class, function ($user, $faker) { $user->accounts()->save(factory(App\Account::class)->make()); });
🎜🎜🎜🎜Buat kilang model 🎜🎜Semasa menguji, anda mungkin perlu memasukkan beberapa rekod sebelum melaksanakan pangkalan data ujian. Apabila mencipta data ujian ini, bukannya menentukan nilai secara manual untuk setiap lajur, Laravel membenarkan anda menggunakan kilang model untuk menentukan set sifat lalai untuk setiap model Eloquent. Sebelum anda mula menguji, semak faildatabase / factory / UserFactory.php
dalam aplikasi anda. Di luar kotak, fail ini mengandungi definisi kilang: 🎜$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) { // ... }); $factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) { // ... });
Dalam Penutupan yang digunakan sebagai definisi kilang, anda boleh mengembalikan nilai ujian lalai untuk semua sifat pada model. Penutupan akan menerima contoh pustaka PHP Faker, yang membolehkan anda menjana pelbagai data rawak untuk ujian dengan mudah.
Anda juga boleh membuat fail kilang tambahan untuk setiap model untuk organisasi yang lebih baik. Contohnya, anda boleh mencipta fail
UserFactory.php
danCommentFactory.php
dalam direktoridatabase/factories
. Semua fail dalam direktorifactory
akan dimuatkan secara automatik oleh 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
Anda boleh menetapkan tempat Faker dengan menambahkan pilihan
faker_locale
dalam fail konfigurasiconfig/app.php
.Negeri Kilang
🎜Negeri membenarkan anda mentakrifkan pengubahsuaian diskret yang boleh digunakan pada kilang model dalam sebarang kombinasi. Contohnya, modelUser
anda mungkin mempunyai keadaandeinquent
yang membolehkan anda mengubah suai salah satu nilai sifat lalainya. Anda boleh menentukan peralihan keadaan menggunakan kaedahstate
. Untuk keadaan mudah, anda boleh lulus satu set pengubahsuaian harta: 🎜rrreee🎜 Jika negeri anda memerlukan pengiraan atau kejadian$ faker
, anda boleh menggunakan Closure untuk mengira pengubahsuaian harta negeri: 🎜rrreee🎜🎜🎜Panggil balik kilang
🎜Gunakan kaedahafterMaking
danafterCreating
untuk mendaftarkan panggilan balik kilang dan membenarkan anda membuat atau mencipta model Kemudian laksanakan tugasan lain. Sebagai contoh, anda boleh menggunakan panggil balik untuk mengaitkan model lain dengan model yang dibuat: 🎜rrreee🎜 Anda juga boleh menentukan panggil balik untuk keadaan kilang: 🎜rrreee🎜🎜🎜Menggunakan kilang model< /h2>🎜🎜🎜
Mencipta model
🎜Selepas kilang model ditakrifkan, anda boleh menggunakan fungsi globalfactory
dalam ujian atau fail benih untuk menjana contoh model. Jadi, mari kita lihat beberapa contoh mencipta model. Pertama, kami akan menggunakan kaedahmake
untuk mencipta model tanpa menyimpannya ke pangkalan data: 🎜rrreee🎜 Anda juga boleh membuat koleksi banyak model atau mencipta model jenis tertentu: 🎜rrreeeGuna Keadaan
🎜Anda juga boleh menggunakan mana-mana keadaan pada model. Jika anda ingin menggunakan berbilang peralihan keadaan pada model, anda harus menentukan nama setiap keadaan yang akan digunakan: 🎜rrreeeTimpa Sifat
🎜 Jika anda ingin mengatasi beberapa nilai lalai model, anda boleh tambahkan satu set nilai yang Diluluskan kepada kaedahmake
. Hanya nilai yang ditentukan akan diganti, manakala nilai selebihnya masih ditetapkan kepada nilai lalai yang ditentukan kilang: 🎜rrreee🎜🎜🎜Persisting Models
🎜Kaedah create bukan sahaja mencipta contoh model, tetapi juga menyimpannya ke pangkalan data menggunakan kaedah save
Eloquent: 🎜rrreee🎜Anda boleh melakukan ini dengan menghantar tatasusunan ke < kod>cipta Kaedah untuk mengatasi sifat pada model: 🎜rrreee🎜🎜🎜🎜Perhubungan
Dalam contoh ini kami akan melampirkan beberapa perhubungan yang mencipta model. Apabila menggunakan kaedah
rrreeecreate
untuk mencipta berbilang model, contoh koleksi Eloquent dikembalikan, supaya kaedah kemudahan seperti setiap satu boleh digunakan pada koleksi:Penutupan Persatuan & Atribut h4>
create
方法创建多个模型时,返回一个 Eloquent 集合实例 ,这样就可以在集合上使用 each 等便利方法:rrreee关联 & 属性闭包
您还可以使用工厂定义中的 Closure 属性将关系附加到模型。 例如,如果您想在创建
rrreeePost
时创建一个新的User
实例,您可以执行以下操作:这些闭包接收一个包含工厂属性的数组:
rrreee可用的断言方法
Laravel 为 PHPUnit 测试提供了多个数据库断言方法:
方法 描述 $this->assertDatabaseHas($table, array $data);
断言数据库表中包含给定的数据。 $this->assertDatabaseMissing($table, array $data);
断言数据库表中不包含给定的数据。 Laravel ialah Ujian PHPUnit menyediakan berbilang kaedah penegasan pangkalan data: Penutupan ini menerima harta kilang yang mengandungi Tatasusunan:rrreee$this->assertSoftDeleted($table, array $data);
Anda juga boleh melampirkan perhubungan pada model menggunakan atribut Penutupan dalam definisi kilang. Contohnya, jika anda ingin mencipta contohPengguna
baharu semasa membuatPost
, anda boleh melakukan perkara berikut:rrreeeKaedah penegasan yang tersedia
thead>< tbody>Kaedah Penerangan $this->assertDatabaseHas($table, array $data) ; kod>
$this->assertDatabaseMissing($table, array $data); kod>🎜Tegaskan bahawa jadual pangkalan data tidak mengandungi data yang diberikan. 🎜🎜
$this->assertSoftDeleted($table, array $data); kod>🎜🎜Menegaskan bahawa rekod yang ditentukan dalam pangkalan data telah dipadam lembut. 🎜🎜🎜🎜🎜Artikel ini pertama kali diterbitkan di laman web 🎜LearnKu.com🎜. 🎜🎜
Laman web PHP Cina
- Kaedah Penegasan yang Boleh Diagihkan