Test de base de données


🎜 🎜🎜🎜🎜cere modèle factory🎜🎜🎜🎜🎜 statutfactory 🎜🎜🎜🎜factory rappe Modèle de persistanceTest de base de données

Retour usine Ajuster

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('/');    
            // ...   
        }
     }

assertDatabaseHas 帮助程序断言数据库中存在的数据与给定的一组条件匹配。 例如,如果您要验证 users 表中的记录是否具有 sally @ example.comemail 值,您可以执行以下操作:

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

🎜Créez une usine de modèles 🎜🎜Pendant le test, vous devrez peut-être insérer quelques enregistrements avant de l'exécuter la base de données de tests. Lors de la création de ces données de test, au lieu de spécifier manuellement les valeurs de chaque colonne, Laravel vous permet d'utiliser une fabrique de modèles pour définir un ensemble de propriétés par défaut pour chaque modèle Eloquent. Avant de commencer les tests, examinez le fichier 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.phpCommentFactory.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();

工厂回调

使用 afterMakingafterCreating 方法注册工厂回调,并允许您在创建或创建模型后执行其他任务。 例如,您可以使用回调将其他模型与创建的模型相关联:

$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'option faker_locale dans le fichier de configuration config/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èle Utilisateur 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éthodes afterMaking 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 :

rrreee

Association et fermeture d'attribut

h4>create 方法创建多个模型时,返回一个 Eloquent  集合实例 ,这样就可以在集合上使用 each 等便利方法:

rrreee

关联 & 属性闭包

您还可以使用工厂定义中的 Closure 属性将关系附加到模型。 例如,如果您想在创建 Post 时创建一个新的 User 实例,您可以执行以下操作:

rrreee

这些闭包接收一个包含工厂属性的数组:

rrreee

可用的断言方法

Laravel 为 PHPUnit 测试提供了多个数据库断言方法:

Ces fermetures reçoivent une propriété d'usine contenant Tableau de :

rrreee

Méthodes d'assertion disponibles

Laravel est Le test PHPUnit fournit plusieurs méthodes d'assertion de base de données :

方法描述
$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
MéthodeDescription
< tbody>$this->assertDatabaseHas($table, tableau $data) ;$this->assertDatabaseMissing($table, array $data);
🎜Affirmez que la table de la base de données ne contient pas les données fournies. 🎜🎜$this->assertSoftDeleted($table, array $data);🎜🎜 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🎜. 🎜🎜