نسخه:

تست پایگاه داده

معرفی

لاراول انواع مختلفی از ابزارهای مفید را برای آزمایش برنامه های کاربردی مبتنی بر پایگاه داده شما فراهم می کند. ابتدا، می‌توانید از assertDatabaseHas راهنما استفاده کنید تا ادعا کنید که داده‌ها در پایگاه داده مطابق با مجموعه معینی از معیارها وجود دارد. به عنوان مثال، اگر می خواهید بررسی کنید که یک رکورد در users جدول با email مقدار وجود دارد sally@example.com ، می توانید موارد زیر را انجام دهید:

public function testDatabase()
{
// Make call to application...
 
$this->assertDatabaseHas('users', [
'email' => 'sally@example.com',
]);
}

همچنین می توانید از assertDatabaseMissing کمک کننده استفاده کنید تا ادعا کنید که داده در پایگاه داده وجود ندارد.

این assertDatabaseHas روش و سایر کمک های مشابه آن برای راحتی است. شما آزاد هستید که از هر یک از روش های ادعایی داخلی PHPUnit برای تکمیل تست های ویژگی خود استفاده کنید.

کارخانه های تولید کننده

برای ایجاد یک کارخانه، از make:factory دستور Artisan استفاده کنید :

php artisan make:factory PostFactory

کارخانه جدید در database/factories دایرکتوری شما قرار می گیرد.

این --model گزینه ممکن است برای نشان دادن نام مدل ایجاد شده توسط کارخانه استفاده شود. این گزینه فایل کارخانه تولید شده را با مدل داده شده از قبل پر می کند:

php artisan make:factory PostFactory --model=Post

تنظیم مجدد پایگاه داده پس از هر تست

اغلب مفید است که پایگاه داده خود را پس از هر آزمون بازنشانی کنید تا داده های آزمایش قبلی با آزمایش های بعدی تداخل نداشته باشند. این RefreshDatabase ویژگی بسته به اینکه از یک پایگاه داده در حافظه استفاده می کنید یا یک پایگاه داده سنتی، بهینه ترین رویکرد را برای انتقال پایگاه داده آزمایشی شما اتخاذ می کند. از این ویژگی در کلاس آزمایشی خود استفاده کنید و همه چیز برای شما انجام می شود:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
use RefreshDatabase;
 
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->get('/');
 
// ...
}
}

کارخانه های نوشتن

هنگام آزمایش، ممکن است لازم باشد قبل از اجرای آزمایش، چند رکورد را در پایگاه داده خود وارد کنید. به جای تعیین دستی مقدار هر ستون هنگام ایجاد این داده های آزمایشی، لاراول به شما اجازه می دهد تا با استفاده از کارخانه های مدل، مجموعه ای از ویژگی های پیش فرض را برای هر یک از مدل های Eloquent خود تعریف کنید . برای شروع، به database/factories/UserFactory.php فایل موجود در برنامه خود نگاهی بیندازید. خارج از جعبه، این فایل حاوی یک تعریف کارخانه است:

use Faker\Generator as Faker;
use Illuminate\Support\Str;
 
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
});

در بسته شدن، که به عنوان تعریف کارخانه عمل می کند، می توانید مقادیر آزمایشی پیش فرض همه ویژگی های مدل را برگردانید. بسته شدن نمونه ای از کتابخانه PHP Faker را دریافت می کند که به شما امکان می دهد انواع مختلفی از داده های تصادفی را برای آزمایش به راحتی تولید کنید.

همچنین می توانید برای سازماندهی بهتر، فایل های کارخانه ای اضافی برای هر مدل ایجاد کنید. به عنوان مثال، می توانید UserFactory.php فایل CommentFactory.php هایی را در database/factories دایرکتوری خود ایجاد کنید. تمام فایل های داخل factories دایرکتوری به طور خودکار توسط لاراول بارگذاری می شوند.

می توانید با افزودن گزینه ای به فایل پیکربندی faker_locale خود، محلی Faker را تنظیم کنید . config/app.php

گسترش کارخانه ها

اگر مدلی را توسعه داده اید، ممکن است بخواهید کارخانه آن را نیز گسترش دهید تا از ویژگی های کارخانه مدل فرزند در طول آزمایش و بذر استفاده کنید. برای انجام این کار، می‌توانید روش کارخانه سازنده را فراخوانی کنید raw تا آرایه خام ویژگی‌ها را از هر کارخانه معین به دست آورید:

$factory->define(App\Admin::class, function (Faker\Generator $faker) {
return factory(App\User::class)->raw([
// ...
]);
});

ایالات کارخانه

ایالت ها به شما اجازه می دهند تا تغییرات گسسته ای را تعریف کنید که می تواند در کارخانه های مدل شما در هر ترکیبی اعمال شود. User به عنوان مثال، مدل شما ممکن است delinquent حالتی داشته باشد که یکی از مقادیر مشخصه پیش فرض آن را تغییر دهد. شما می توانید تبدیل حالت خود را با استفاده از state روش تعریف کنید. برای حالت های ساده، می توانید آرایه ای از تغییرات ویژگی را ارسال کنید:

$factory->state(App\User::class, 'delinquent', [
'account_status' => 'delinquent',
]);

اگر حالت شما نیاز به محاسبه یا یک $faker نمونه دارد، می توانید از Closure برای محاسبه تغییرات ویژگی حالت استفاده کنید:

$factory->state(App\User::class, 'address', function ($faker) {
return [
'address' => $faker->address,
];
});

تماس های کارخانه ای

afterMaking تماس‌های کارخانه با استفاده از روش‌های و ثبت می‌شوند afterCreating و به شما اجازه می‌دهند تا پس از ساخت یا ایجاد یک مدل، کارهای بیشتری را انجام دهید. به عنوان مثال، می توانید از callbacks برای ارتباط مدل های اضافی به مدل ایجاد شده استفاده کنید:

$factory->afterMaking(App\User::class, function ($user, $faker) {
// ...
});
 
$factory->afterCreating(App\User::class, function ($user, $faker) {
$user->accounts()->save(factory(App\Account::class)->make());
});

همچنین می‌توانید تماس‌های برگشتی را برای حالت‌های کارخانه تعریف کنید :

$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) {
// ...
});
 
$factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) {
// ...
});

استفاده از کارخانه ها

ایجاد مدل ها

هنگامی که کارخانه‌های خود را تعریف کردید، می‌توانید از factory تابع سراسری در آزمایش‌های ویژگی یا فایل‌های seed خود برای تولید نمونه‌های مدل استفاده کنید. بنابراین، اجازه دهید نگاهی به چند نمونه از ایجاد مدل بیندازیم. ابتدا از روش برای ایجاد مدل ها استفاده می کنیم make اما آنها را در پایگاه داده ذخیره نمی کنیم:

public function testDatabase()
{
$user = factory(App\User::class)->make();
 
// Use model in tests...
}

همچنین می‌توانید مجموعه‌ای از مدل‌های زیادی ایجاد کنید یا مدل‌هایی از یک نوع خاص ایجاد کنید:

// Create three App\User instances...
$users = factory(App\User::class, 3)->make();

کشورهای متقاضی

همچنین می توانید هر یک از حالت های خود را در مدل ها اعمال کنید. اگر می خواهید چندین تبدیل حالت را به مدل ها اعمال کنید، باید نام هر حالتی را که می خواهید اعمال کنید، مشخص کنید:

$users = factory(App\User::class, 5)->states('delinquent')->make();
 
$users = factory(App\User::class, 5)->states('premium', 'delinquent')->make();

ویژگی های برتر

اگر می‌خواهید برخی از مقادیر پیش‌فرض مدل‌های خود را لغو کنید، می‌توانید آرایه‌ای از مقادیر را به make متد ارسال کنید. فقط مقادیر مشخص شده جایگزین می شوند در حالی که بقیه مقادیر روی مقادیر پیش فرض خود که توسط کارخانه مشخص شده است تنظیم می شوند:

$user = factory(App\User::class)->make([
'name' => 'Abigail',
]);

مدل های ماندگار

این create روش نه تنها نمونه های مدل را ایجاد می کند، بلکه آنها را با استفاده از روش Eloquent در پایگاه داده ذخیره می کند save :

public function testDatabase()
{
// Create a single App\User instance...
$user = factory(App\User::class)->create();
 
// Create three App\User instances...
$users = factory(App\User::class, 3)->create();
 
// Use model in tests...
}

می‌توانید با ارسال یک آرایه به متد، ویژگی‌های مدل را لغو کنید create :

$user = factory(App\User::class)->create([
'name' => 'Abigail',
]);

روابط

در این مثال، ما یک رابطه را به برخی از مدل های ایجاد شده پیوست می کنیم. هنگام استفاده از create روش برای ایجاد چندین مدل، یک نمونه مجموعه Eloquent برگردانده می شود که به شما امکان می دهد از هر یک از توابع راحت ارائه شده توسط مجموعه استفاده کنید، مانند each :

$users = factory(App\User::class, 3)
->create()
->each(function ($user) {
$user->posts()->save(factory(App\Post::class)->make());
});

می توانید از createMany روش برای ایجاد چندین مدل مرتبط استفاده کنید:

$user->posts()->createMany(
factory(App\Post::class, 3)->make()->toArray()
);

بسته شدن روابط و ویژگی

همچنین می‌توانید روابطی را به مدل‌ها در تعاریف کارخانه خود متصل کنید. به عنوان مثال، اگر می خواهید User هنگام ایجاد یک نمونه جدید ایجاد کنید Post ، می توانید موارد زیر را انجام دهید:

$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => factory(App\User::class),
];
});

اگر این رابطه به کارخانه ای که آن را تعریف می کند بستگی دارد، می توانید یک callback ارائه دهید که آرایه ویژگی ارزیابی شده را می پذیرد:

$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => factory(App\User::class),
'user_type' => function (array $post) {
return App\User::find($post['user_id'])->type;
},
];
});

استفاده از دانه ها

اگر می‌خواهید از کاشت‌های پایگاه داده برای پر کردن پایگاه داده خود در طول آزمایش ویژگی استفاده کنید، می‌توانید از این seed روش استفاده کنید. به‌طور پیش‌فرض، این seed متد، را برمی‌گرداند DatabaseSeeder که باید همه بذرهای دیگر شما را اجرا کند. از طرف دیگر، شما یک نام کلاس seeder خاص را به seed متد ارسال می کنید:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use OrderStatusSeeder;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
use RefreshDatabase;
 
/**
* Test creating a new order.
*
* @return void
*/
public function testCreatingANewOrder()
{
// Run the DatabaseSeeder...
$this->seed();
 
// Run a single seeder...
$this->seed(OrderStatusSeeder::class);
 
// ...
}
}

ادعاهای موجود

لاراول چندین ادعای پایگاه داده را برای تست های ویژگی PHPUnit شما ارائه می دهد :

روش شرح
$this->assertDatabaseCount($table, int $count); ادعا کنید که یک جدول در پایگاه داده حاوی مقدار مشخصی از ورودی ها است.
$this->assertDatabaseHas($table, array $data); ادعا کنید که یک جدول در پایگاه داده حاوی داده های داده شده است.
$this->assertDatabaseMissing($table, array $data); ادعا کنید که یک جدول در پایگاه داده حاوی داده های داده شده نیست.
$this->assertDeleted($table, array $data); ادعا کنید که رکورد داده شده حذف شده است.
$this->assertSoftDeleted($table, array $data); ادعا کنید که رکورد داده شده به نرمی حذف شده است.

برای راحتی کار، می‌توانید مدلی را به assertDeleted و assertSoftDeleted helpers ارسال کنید تا به ترتیب از پایگاه داده بر اساس کلید اصلی مدل، رکورد حذف شده یا نرم‌افزار حذف شود.

به عنوان مثال، اگر از یک کارخانه مدل سازی در تست خود استفاده می کنید، می توانید این مدل را به یکی از این کمک کنندگان ارسال کنید تا برنامه شما را به درستی حذف شده از پایگاه داده آزمایش کند:

public function testDatabase()
{
$user = factory(App\User::class)->create();
 
// Make call to application...
 
$this->assertDeleted($user);
}