【问题标题】:Is there a way to test Eloquent Observers in Laravel 5.8?有没有办法在 Laravel 5.8 中测试 Eloquent Observers?
【发布时间】:2020-02-16 05:01:03
【问题描述】:

这是我遇到的问题: 我的代码设置为每当 Model X 的标题更新时,它应该改变 Model Y 的计数。

所以我所做的是,我发送将触发上述事件的请求,但是每当我检查是否在数据库中进行了更改时,它们都没有。

我在 X Observers 更新函数中尝试了 dd(),它被正确触发了。

有什么想法吗?

编辑:我正在使用 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 for getContent 的最后一行打印出来: name => JAJCA 而对于DB::table('books')->where('name', '=', 'JAJCA')->get(),则返回空数组。

【问题讨论】:

  • 你能告诉我们在你更新的钩子中触发的代码吗?
  • 这是stackoverflow,这里我们需要代码来帮助你,并且要求你到目前为止展示你的过程。如果没有看到您的实施,我们将如何为您提供帮助?
  • 你在测试时的队列设置是什么?
  • @mrhn 我已经用一些代码更新了我的问题。此外,队列设置为 SYNC
  • 另外,很奇怪的是,如果我使用 UPDATING 而不是 UPDATED 我会得到想要的结果。

标签: laravel testing eloquent phpunit


【解决方案1】:

在保存后更新了触发器。如果您想通过事件更改输入,您还必须使用更新和创建。

所以要么像这样使用更新,保存将在这个事件之后发生,更新它已经发生了。

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

模型是引用,因此您正在更新对象而不是保存它。

【讨论】:

  • 感谢您解决问题!非常清晰准确的答案!
  • 你的保存评论很糟糕,因为它会导致堆栈溢出触发新的更新事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多