Test de base de données
Retour usine Ajuster
- Utilisation modéliser des usines en tests
- Créer des modèles
- Modèles de persistance
- Associations de modèles
- Méthodes d'assertion disponibles
-
- Introduction
- Laravel fournit divers Un outil utile qui permet tester plus facilement les applications basées sur des bases de données. Tout d'abord, vous pouvez utiliser l'assistant
assertDatabaseHas
pour affirmer que les données présentes dans la base de données correspondent à un ensemble de conditions donné. Par exemple, si vous souhaitez vérifier qu'un enregistrement dans la tableusers
a une valeuremail
poursally @ example.com
, vous feriez ce qui suit :public function testDatabase(){ // Make call to application... $this->assertDatabaseHas('users', [ 'email' => 'sally@example.com' ]); }
Vous pouvez également affirmer que les données n'existent pas dans la base de données en utilisant l'assistant - La méthode
assertDatabaseHas
et d'autres aides similaires sont destinées à plus de commodité. Vous êtes libre d'utiliser n'importe laquelle des méthodes d'assertion intégrées à PHPUnit pour compléter vos tests. - Génération d'usines modèles
assertDatabaseMissing
.make:factory
Artisan pour créer une usine modèle : - Laravel fournit divers Un outil utile qui permet tester plus facilement les applications basées sur des bases de données. Tout d'abord, vous pouvez utiliser l'assistant
php artisan make:factory PostFactory
--model
peut être utilisée pour indiquer le nom du modèle créé par l'usine. Cette option pré-remplira le fichier d'usine généré avec le modèle donné : php artisan make:factory PostFactory --model=Post
Réinitialiser la base de données après chaque test
C'est souvent utile pour réinitialiser la base de données après le test afin que les données d'un test précédent n'interfèrent pas avec les tests suivants. La fonctionnalité RefreshDatabase
adopte une approche optimisée pour migrer les bases de données de test, selon que vous utilisez une base de données en mémoire ou traditionnelle. Utilisez des traits sur votre classe de test et tout sera pris en charge pour vous :
<?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('/'); // ... } }
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 command 命令可以创建一个模型工厂:
$factory->state(App\User::class, 'delinquent', [ 'account_status' => 'delinquent', ]);
新生成的工厂位置在 database/factories
目录下。
--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 / factories / UserFactory.php
database / plants / UserFactory.php
dans votre application. Prêt à l'emploi, ce fichier contient une définition d'usine : 🎜$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) { // ... }); $factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) { // ... });
Dans une Closure utilisée comme définition d'usine, vous pouvez renvoyer des valeurs de test par défaut pour toutes les propriétés du modèle. Closure recevra une instance de la bibliothèque PHP Faker, qui vous permet de générer facilement une variété de données aléatoires à des fins de test.
Vous pouvez également créer des fichiers d'usine supplémentaires pour chaque modèle pour une meilleure organisation. Par exemple, vous pouvez créer les fichiers UserFactory.php
et CommentFactory.php
dans le répertoire database/factories
. Tous les fichiers du répertoire factories
seront automatiquement chargés par 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
Vous pouvez définir les paramètres régionaux de Faker en ajoutant l'optionfaker_locale
dans le fichier de configurationconfig/app.php
.
États d'usine
🎜Les états vous permettent de définir des modifications discrètes qui peuvent être appliquées aux usines modèles dans n'importe quelle combinaison. Par exemple, votre modèleUtilisateur
peut avoir un état déinquent
qui vous permet de modifier l'une de ses valeurs de propriété par défaut. Vous pouvez définir des transitions d'état à l'aide de la méthode state
. Pour les états simples, vous pouvez transmettre un ensemble de modifications de propriété : 🎜rrreee🎜 Si votre état nécessite un calcul ou une instance $ faker
, vous pouvez utiliser Closure pour calculer les modifications de propriété de l'état : 🎜rrreee🎜🎜🎜Rappels d'usine
🎜Utilisez les méthodesafterMaking
et afterCreating
pour enregistrer les rappels d'usine et vous permettre de créer ou de créer modèles Effectuez ensuite d’autres tâches. Par exemple, vous pouvez utiliser des rappels pour associer d'autres modèles au modèle créé : 🎜rrreee🎜 Vous pouvez également définir des rappels pour les états d'usine : 🎜rrreee🎜🎜🎜Utilisation d'usines modèles< /h2>🎜🎜🎜Création de modèles
🎜Une fois la fabrique de modèles définie, vous pouvez utiliser la fonction globale factory
dans un test ou un fichier de départ pour générer des instances de modèle. Voyons donc quelques exemples de création de modèles. Tout d'abord, nous allons utiliser la méthode make
pour créer des modèles sans les enregistrer dans la base de données : 🎜rrreee🎜 Vous pouvez également créer une collection de plusieurs modèles ou créer un modèle d'un type donné : 🎜rrreee Appliquer des états
🎜Vous pouvez également appliquer n'importe quel état à un modèle. Si vous souhaitez appliquer plusieurs transitions d'état à un modèle, vous devez spécifier le nom de chaque état à appliquer : 🎜rrreee Remplacer les propriétés
🎜 Si vous souhaitez remplacer certaines des valeurs par défaut du modèle, vous pouvez ajouter un ensemble de valeurs Passé à la méthode make
. Seules les valeurs spécifiées seront remplacées, tandis que les valeurs restantes seront toujours définies sur les valeurs par défaut spécifiées en usine : 🎜rrreee🎜🎜🎜Modèles persistants
🎜 La méthode create
crée non seulement des instances de modèle, mais les enregistre également dans la base de données à l'aide de la méthode save
d'Eloquent : 🎜rrreee🎜Vous pouvez le faire en passant un tableau à < code>create Méthode pour remplacer les propriétés sur le modèle : 🎜rrreee🎜🎜🎜🎜Relations
Dans cet exemple, nous attacherons quelques relations qui créent le modèle. Lorsque vous utilisez la méthode create
pour créer plusieurs modèles, une instance de collection Eloquent est renvoyée, afin que des méthodes pratiques telles que each puissent être utilisées sur la collection :
rrreeeAssociation et fermeture d'attribut h4>create
方法创建多个模型时,返回一个 Eloquent 集合实例 ,这样就可以在集合上使用 each 等便利方法:rrreee关联 & 属性闭包
您还可以使用工厂定义中的 Closure 属性将关系附加到模型。 例如,如果您想在创建 Post
时创建一个新的 User
实例,您可以执行以下操作:
rrreee这些闭包接收一个包含工厂属性的数组:
rrreee可用的断言方法
Laravel 为 PHPUnit 测试提供了多个数据库断言方法:
create
pour créer plusieurs modèles, une instance de collection Eloquent est renvoyée, afin que des méthodes pratiques telles que each puissent être utilisées sur la collection :create
方法创建多个模型时,返回一个 Eloquent 集合实例 ,这样就可以在集合上使用 each 等便利方法:rrreee关联 & 属性闭包
Post
时创建一个新的 User
实例,您可以执行以下操作:方法 | 描述 | |
---|---|---|
$this->assertDatabaseHas($table, array $data); | 断言数据库表中包含给定的数据。 | |
$this->assertDatabaseMissing($table, array $data); | 断言数据库表中不包含给定的数据。 | |
$this->assertSoftDeleted($table, array $data); Vous pouvez également attacher des relations aux modèles à l'aide de l'attribut Closure dans la définition de l'usine. Par exemple, si vous souhaitez créer une nouvelle instance User lors de la création d'un Post , vous devez procéder comme suit :rrreee | Ces fermetures reçoivent une propriété d'usine contenant Tableau de :rrreee
Méthode | Description |
---|
$this->assertDatabaseHas($table, tableau $data) ; code>$this->assertDatabaseMissing($table, array $data); code>🎜Affirmez que la table de la base de données ne contient pas les données fournies. 🎜🎜$this->assertSoftDeleted($table, array $data); code>🎜🎜 Affirme que l'enregistrement spécifié dans la base de données a été supprimé de manière logicielle. 🎜🎜🎜🎜🎜Cet article a été publié pour la première fois sur le site 🎜LearnKu.com🎜. 🎜🎜