簡體   English   中英

Laravel - 將關系添加到工廠創建的 model

[英]Laravel - adding relationships to a factory-created model

我正在測試一個包含多對多關系的急切加載關系。 現在我在測試中有查詢和附件。 我想知道是否有辦法將它們移入工廠,而不是將其作為測試的一部分。 這將限制測試的規模,然后可以在每次創建電影工廠時創建和使用這些關系。

test

public function grabFilmTest()
{
    $film = factory(Film::class)->create();

    $categories = Category::where('main-cat', 'Science')->where('sub-cat', 'Fiction')->first();
    $languages = Languages::where('name', 'english')->first();

    $film->categories()->attach($categories->id);
    $film->languages()->attach($languages->id);

    $response = $this->json('GET', '/film/' . $film->id)
        ->assertStatus(200);

    $response
        ->assertExactJson([
            'id' => $film->id,
            'name' => $film->name,
            'description' => $film->description,
            'categories' => $film->categories->toArray(),
            'languages' => $film->languages->toArray()

}

filmFactory

$factory->define(\App\Models\Film::class, function (Faker $faker){
    return [
        'id' => $faker->uuid,
        'name' => $faker->text,
        'description' => $faker->paragraph,
    ];
});

如果有人可以幫助我如何做到這一點或舉個例子,那就太好了:D

您可以使用工廠回調在工廠文件中執行此操作:

<?php
use \App\Models\Film;
use \App\Models\Category;
use \App\Models\Languages;

$factory->define(Film::class, function(Faker $faker){
    return [
        'id'          => $faker->uuid,
        'name'        => $faker->text,
        'description' => $faker->paragraph,
    ];
});

$factory->afterCreating(Film::class, function(Film $film, Faker $faker) {
    $category = Category::where('main-cat', 'Science')->where('sub-cat', 'Fiction')->first();
    $language = Languages::where('name', 'english')->first();
    $film->categories()->attach($category);
    $film->languages()->attach($language);
});

您可以使用工廠狀態工廠回調

$factory->define(\App\Models\Film::class, function (Faker $faker){
    return [
        'id' => $faker->uuid,
        'name' => $faker->text,
        'description' => $faker->paragraph,
    ];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
    return [
        // Category fields 
    ];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
    return [
        // Language fields 
    ];
});
$factory->afterCreatingState(\App\Models\Film::class, 'with-category', function (\App\Models\Film $film) {
    $category = factory(\App\Models\Category::class)->create();
    $film->categories()->attach($category->id);
});
$factory->afterCreatingState(\App\Models\Film::class, 'with-language', function (\App\Models\Film $film) {
    $language = factory(\App\Models\Language::class)->create();
    $film->categories()->attach($language->id);
});

然后你可以在這樣的測試中使用:

public function grabFilmTest()
{
    $film = factory(Film::class)->create();
    $filmWithCategory = factory(Film::class)->state('with-category')->create();
    $filmWithLanguage = factory(Film::class)->state('with-language')->create();
    $filmWithCategoryAnLanguage = factory(Film::class)->states(['with-category', 'with-language'])->create();
    // ...
}

PS:我不建議使用現有數據。 根據經驗,我可以告訴你,這會變得非常痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM