Вызов фабрики на другой фабрике - PullRequest
0 голосов
/ 03 октября 2018

В настоящее время я учусь писать тест PHPUnit с помощью приложения laravel и уже несколько дней биться в кирпичную стену.Мой тест состоял в том, чтобы позволить только аутентифицированным пользователям обновлять запись книги, если идентификатор пользователя совпадает с идентификатором пользователя книги.

public function test_onlyAuthenticatedUserCanUpdateBookSuccessfully()
{
    $user = factory(User::class)->create();
    Passport::actingAs($user);

    $book = factory(Book::class)->create();

    dd($user, $book);

    // $response = $this->json('PUT', '/api/books/'.$book->id, [
    //         'id'    => $book->id,
    //         'title' => 'Updated book title',
    //         'author'=> 'New Guy'
    //     ]);

    // $response->assertStatus(201);
}

Но изначально я получил ошибку 403, и во время устранения неполадок я заметил из дамповданные о том, что идентификатор созданного пользователя не совпадает с идентификатором user_id книги.

// Newly created user
#original: array:7 [
    "name" => "Prof. Norwood Erdman"
    "email" => "ihoeger@example.com"
    "updated_at" => "2018-10-03 14:11:20"
    "created_at" => "2018-10-03 14:11:20"
    "id" => 2
]

// Newly created book
#attributes: array:6 [
    "title" => "Quasi laudantium enim quas omnis."
    "author" => "Mr. Jayson Roob"
    "user_id" => 1
    "updated_at" => "2018-10-03 14:11:20"
    "created_at" => "2018-10-03 14:11:20"
    "id" => 3
]

Просматривая мой код, я обнаружил, что каждый раз при создании книги для user_id будет задано значение 1, поскольку мой BooksFactory используетжестко закодированное значение user_id = 1.

$factory->define(Book::class, function (Faker $faker) {
return [
    'title'     => $faker->sentence,
    'author'    => $faker->name,
    'user_id'   => 1
];
});

Как мне написать свой код, чтобы в моем тесте при создании книги идентификатор аутентифицированного пользователя назначался в качестве идентификатора пользователя книги?Я думаю, что это исправит тест.Я использую базу данных sqlite памяти для тестирования, а не mysql.

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете переопределить атрибуты на фабрике, передав массив методу create() с атрибутами и значениями, которые вы хотите переопределить:

$book = factory(Book::class)->create(['user_id' => $user->id]);

Кроме того, это может быть хорошимИдея создания создать пользователя на самой фабрике, например:

$factory->define(Book::class, function (Faker $faker) {
    return [
        'title'     => $faker->sentence,
        'author'    => $faker->name,
        'user_id'   => function () {
            return factory(App\User::class)->create()->id;
        }
    ];
});

Причина, по которой значение user_id в завернутом закрытии, состоит в том, чтобы остановить создание другого пользователя, если вы хотите передать свой собственный идентификатор.

Документация по переопределению атрибутов

...