Есть ли способ протестировать Eloquent Observers в Laravel 5.8? - PullRequest
1 голос
/ 19 октября 2019

Это проблема, с которой я столкнулся: мой код настроен так, что всякий раз, когда обновляется заголовок модели X, он должен изменять счет модели Y.

Итак, я отправляю запрос, чтобывызовет событие, описанное выше, НО всякий раз, когда я проверяю, внесены ли изменения в базу данных, это не так.

Я пробовал dd () в обновленной функции X Observers, и она запускается правильно.

Есть идеи?

Редактировать: я тестирую с assertDatabaseHas ()

Edit2: Это мой код для теста

public function testBasicTest()
{
    $user = factory(User::class)->create();
    $book = Book::create([
        'user_id' => $user->id,
        'name' => 'test'
    ]);

    $response = $this->getJson('/api/books-update?book_id=' . $book->id);

    $response->assertStatus(200);

    dd($response->getContent(), DB::table('books')->where('name', '=', 'JAJCA')->get());
}

Иэто мой контроллер:

public function testEndpoint(Request $request)
{
    $book_id = $request->get('book_id');
    $book = Book::find($book_id);
    $book->update([
        'name' => 2
    ]);

    return response()->json($book, 200);
}

А это BookObserver @ updated

public function updated(Book $book)
{
    $book->name = 'JAJCA';
}

Последняя строка из TestBasicTest для getContent распечатывает: name => JAJCA А для DB::table('books')->where('name', '=', 'JAJCA')->get() возвращаетпустой массив.

1 Ответ

1 голос
/ 19 октября 2019

Обновлены триггеры после его сохранения. Если вы хотите изменить ввод через события, вам также придется использовать Обновление и создание.

Так что либо используйте Обновление следующим образом, сохранение произойдет после этого события, а обновление уже произошло.

public function updating(Book $book)
{
    $book->name = 'JAJCA';
}

Почему ваш ответ правильный, а база данных - нет, Модели являются ссылками, поэтому вы обновляете объект, но не сохраняете его.

...