有没有办法在Laravel 5.8中测试雄辩的旁观者?

时间:2019-10-19 12:29:42

标签: laravel testing eloquent phpunit

这是我遇到的问题: 我的代码设置为每当更新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的getContent的最后一行打印出来: name => JAJCA 对于DB::table('books')->where('name', '=', 'JAJCA')->get(),返回空数组。

1 个答案:

答案 0 :(得分:1)

更新后的触发器将被保存。如果要通过事件更改输入,则还必须使用“更新和创建”。

所以要么像这样使用Updating,保存将在此事件之后发生,并且已经进行了更新。

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

为什么您的回答是正确的而数据库不是,模型是引用,所以您在更新对象但不保存它。