有没有办法在 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 有条件地插入 sql 片段

laravel 5.8 在 getenv 上返回 false

如何在 Laravel 5.8 中使 chart.js 动画/增长/活着?

如何在关系表laravel 5.8中解码Json数据