Fabrika Devletlerinde Fabrikalarla Daha Derine Geçmek

Laravel'e aşina olursanız, uygulama geliştirmenizde fabrikaları ve hatta fabrika durumlarını kullanabileceğinizi biliyoruz. Dokümantasyon size, test verilerini oluşturmak ve oluşturmak için fabrikaları kullanma tekniklerini gösterir, ancak modellerinizi fabrikalarla birlikte kullanmak istediğim etkili bir şekilde düşünmek için birkaç yol gösterici düşünce vardır.

Aşağıdakiler, fabrika durumlarını kullanarak daha verimli bir şekilde düşündüğüm bazı yaklaşımlardır:

Öncelikle Faker'i her şey için kullanmak yerine fabrikalar statik değerler üretiyor.

İkinci olarak, fabrikalarınız sadece bir modelin örneğini oluşturmak için gerekli en basit nitelikler kümesini oluşturmalıdır.

Faker yerine Statik Verileri Kullanma

Sahte kullanmanın yanlış olduğunu öne sürmüyorum, bunun yerine, bu statik değerler test verilerini rastgele verilere göre daha belirgin hale getirebilir.

Aşağıdaki User fabrikasını düşünün:

$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'remember_token' => str_random(10),
];
});

Kod örneği Laravel 5.6 ile birlikte gelen kullanıcı fabrikasıdır. Fabrika tanımında eleştirmek istediğim bir şey yok – bu gayet iyi. Bununla birlikte, test paketinizi çalıştırdığınızda, her seferinde yeni değerlerin üretileceğini düşünmenizi isterim:

// First test run
array:5 [
"name" => "Troy Miller III"
"email" => "orrin93@example.org"
"updated_at" => "2018-04-09 01:35:38"
"created_at" => "2018-04-09 01:35:38"
"id" => 1
]

// Second test run
array:5 [
"name" => "Mr. Zachariah McGlynn"
"email" => "lturcotte@example.net"
"updated_at" => "2018-04-09 01:35:41"
"created_at" => "2018-04-09 01:35:41"
"id" => 1
]

Test verilerinin bu randomizasyonunun iyi bir şey olduğunu ve test kitlenizi daha sağlam hale getirdiğini hissedebilirsiniz. Bu geçerli bir argüman, ancak verileri doğrulamak için yazmanız gereken eşlik eden testi düşünün:

public function testWelcomeMessageTest()
{
$user = factory('App\User')->create();

$response = $this->get('/');
$response->assertSeeText('Welcome '.$user->name);
}

Bu testte doğal olarak yanlış bir şey olmadığını tekrar vurgulamak istiyorum, ama beyninizde biraz ayrıştırma yapan fazladan “sihir” var gibi hissediyorum. Testin akılda biraz daha okunabilir olmasını sağlayan kodlanmış bir onaylama yerine, testin geçtiğini iddia etmek için bir değişken kullanıyorum.

Aşağıdaki fabrika göz önünde bulundurun:

$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => 'Example User,
'email' => 'example@example.com',
// ...
];
});

Sabit kodlanmış ad ve e-posta ince bir değişikliktir, ancak şimdi testim şöyle görünebilir:

public function testWelcomeMessageTest()
{
factory('App\User')->create();

$response = $this->get('/');
$response->assertSeeText('Welcome Example User');
}

Başka bir yaklaşım ise dinamik verilere sahip bir fabrika kullanmak ve test etmek istediğiniz şeyi geçersiz kılmaktır:

public function testWelcomeMessageTest()
{
factory('App\User')->create([
'name' => 'Example User',
]);

$response = $this->get('/');
$response->assertSeeText('Welcome Example User');
}

Uygulamalarınızda size neyin uygun olduğunu düşünmelisiniz, ancak umarım en azından her şey için sahtekâr kullanmak zorunda kalmazsınız. Aslında, bu ince kaymanın bir sonucu olarak testlerde daha fazla netliğe sahip olabilirsiniz.

Faktörün sağladığı rastlantısallığı kaybetmek istemiyorsanız, varsayılan testleriniz için bazı statik değerler içeren bir fabrika durumu kullanmayı düşünün:

$factory->define(App\User::class, 'user', function (Faker $faker) {
return [
'name' => 'Example User,
'email' => 'example@example.com',
];
});

Daha sonra, temel, statik bir kullanıcı istediğiniz testlerde:

public function testWelcomeMessageTest()
{
factory('App\User')->states('user')->create();

$response = $this->get('/');
$response->assertSeeText('Welcome Example User');
}

user durumu, modelinizin gereksinim duyduğu temel özellikler kümesini temsil eder; model oluşturmak için gereken minimum uygulanabilir özelliklerdir.

Minimum Canlı Öznitelikleri

Bir model oluşturmak için gereken minimum veri miktarıyla fabrikalar ve test verileri oluşturmak, testlerinizde tanıtım yapmak için iyi bir alışkanlıktır. Bir alanın geçersiz olması veya modelin isteğe bağlı ilişkileri varsa, bunları varsayılan fabrikada tanımlama.

Testleriniz, boş değerler ve boş ilişkiler ile ilgili sorunları daha kolay yakalamanıza yardımcı olacaktır. Boş bir model ilişkisi, genellikle, kullanıcılarınızın uygulamalarınızda karşılaşacağı ilk durumdur.

Veritabanındaki bir sütun null edilebildiği zaman, varsayılan olarak fabrikada atlayın ve daha sonra gerekli olan minimum verilerden daha fazla olan modelleri test etmek için durumları kullanın.

Örneğin bir forum uygulamasını ele alalım. Kullanıcı ilk kaydettiğinde, henüz herhangi bir yayın oluşturmamış veya başkalarının gönderileri hakkında yorum yapmamış olacak. Bu, minimum gereksinimle uygulamanızda en temel kullanıcıyı temsil eder.

Fabrika verilerine ve vericinize sahip olmak, olabildiğince fazla veriyi doldurmayı cazip kılar, ancak yalnızca varsayılan model fabrika durumlarınızda gerekli olan verileri tanımlayın.

Gelişmiş Fabrika Verileri İçin Devletleri Kullanma

Bir forum uygulamasının örneğini kullanarak, testlerimizin gerekli minimum verilerden daha fazlasına ihtiyaç duyduğu durumlarda, gönderim yapan kullanıcılar için bir durum tanımlayabiliriz:

$factory
->state(App\User::class, 'with_posts', [])
->afterCreatingState(App\User::class, 'with_posts', function ($user, $faker) {
factory(App\Post::class, 5)->create([
'user_id' => $user->id,
]);
});

Bu durumun herhangi bir geçersiz kılma verisi yoktur, böylece boş bir diziyi bir kapatma yerine üçüncü argüman olarak iletebiliriz. Şu anda testlerimizde kullanabileceğimiz, kullanıcıyla ilişkili bazı yayınları tanımlamak için afterCreatingState yöntemini kullanıyoruz:

$user = factory('App\User')->states('with_posts')->create();

Bu yaklaşımın en büyük dezavantajı afterCreatingState geri afterCreatingState kodlanmış 5 afterCreatingState . Sadece sözde kod yazıyorum, ancak bu API gibi bir şey hoş olabilir:

$user = factory('App\User')
->states('with_posts', ['posts_count' => 5])
->create();

Ve sonra fabrika API'sinin diğer tarafında, böyle bir şey:

$factory
->state(App\User::class, 'with_posts', [])
->afterCreatingState(App\User::class, 'with_posts', function ($user, $faker, $config) {
factory(App\Post::class, $config->get('posts_count', 5))->create([
'user_id' => $user->id,
]);
});

Yine, bu sahte kod ve işe yaramaz! Ama bu yaklaşımın daha iyi olabileceğinin birkaç yolunu göstermek istedim. Belki de bu paket, bir paketin temel API işlevselliğini bir şekilde bu API'ye ulaşmak için genişletebileceği bir alandır.

Eksikliklerde bile, kullanıcı durumlarını postalarla kullanmanın mükemmel bir deklarasyon yoluna sahibiz.

Diğer Fabrika Durumu Yaklaşımları

Ayrıca, bir kullanıcı için gönderiler ve kullanıcı için istediğimiz başka bir durum için daha dinamik bir durum oluşturmak üzere test çerçevesinde bir özellik kullanabiliriz:

<?php

namespace Tests\factories;

trait UserFactory
{
public function userWithPosts($config = [])
{
$user = factory(\App\User::class)->create();
$posts = factory(
\App\Post::class,
$config['posts_count'] ?? 5
)->make([
'user_id' => $user->id,
]);

$user->posts()->saveMany($posts);

return $user;
}
}

Mesajları olan bir kullanıcıya ihtiyaç duyan testlerde, aşağıdakileri kullanırsınız:

namespace Tests\Feature;

use Tests\TestCase;
use Tests\factories;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
use RefreshDatabase;
use factories\UserFactory;

public function testWelcomeMessageTest()
{
$user = $this->userWithPosts(['posts_count' => 5]);
// ...
}
}

En üstteki use Tests\factories tanımlamayı ve use factories\UserFactory; Özelliği nereden ithal ettiğimi anladım; çünkü bu özellik, fabrika verilerine yönelik özel bir bakışta. Bir özelliği kullanmak, yeterli miktarda boilerplate gerektirir, ancak statik fabrika durumumuzdan beşte sabit kodlanmış yayın sayısıyla daha esnektir.

Daha fazla bilgi edin

Laravel belgelerinde fabrika durumları hakkında daha fazla bilgi edinebilirsiniz. Daha fazla pozlama almak ve fabrikaların nasıl çalıştığını düşünmek istiyorsanız bir başka mükemmel kaynak, bir Ruby gem Factory Bot, özellikle başlangıç ​​belgesini oluşturuyor.

Fabrikalar Çıplak Minimum olmalıdır Fabrikalar ile çalışma konusunda bir başka mükemmel kaynak, yukarıda bahsedilen Fabrika Bot kütüphanesinin yazarı tarafından.

Bir önceki yazımız olan Laravel İsteğe Bağlı Yardımcı ve Yeni Opsiyonel Kapanışı Kullanma başlıklı makalemizi de okumanızı öneririz.

About This Author

Comments are closed

%d blogcu bunu beğendi: