有没有办法在 Laravel 5.8 中测试 Eloquent Observers?
Posted
技术标签:
【中文标题】有没有办法在 Laravel 5.8 中测试 Eloquent Observers?【英文标题】:Is there a way to test Eloquent Observers in Laravel 5.8? 【发布时间】: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()
,则返回空数组。
【问题讨论】:
你能告诉我们在你更新的钩子中触发的代码吗? 这是***,这里我们需要代码来帮助你,并且要求你到目前为止展示你的过程。如果没有看到您的实施,我们将如何为您提供帮助? 你在测试时的队列设置是什么? @mrhn 我已经用一些代码更新了我的问题。此外,队列设置为 SYNC 另外,很奇怪的是,如果我使用 UPDATING 而不是 UPDATED 我会得到想要的结果。 【参考方案1】:在保存后更新了触发器。如果您想通过事件更改输入,您还必须使用更新和创建。
所以要么像这样使用更新,保存将在这个事件之后发生,更新它已经发生了。
public function updating(Book $book)
$book->name = 'JAJCA';
模型是引用,因此您正在更新对象而不是保存它。
【讨论】:
感谢您解决问题!非常清晰准确的答案! 你的保存评论很糟糕,因为它会导致堆栈溢出触发新的更新事件。以上是关于有没有办法在 Laravel 5.8 中测试 Eloquent Observers?的主要内容,如果未能解决你的问题,请参考以下文章
LARAVEL 5.8 - 在 foreach 中使用数组的 WHERE LIKE 子句的多个条件没有给出完整的结果
当表 laravel 5.8 中没有数据时,null 返回总和而不是 0
laravel 5.8 在 getenv 上返回 false