BeefNoodle
BeefNoodle

Reputation: 133

Mass Update and Examing Attribute Change are not working (Laravel)

I have this piece of code which I want to perform Mass Update and Examing Attribute Change on the User table. However, when I ran the php artisan test, there is an error said that 'This test did not perform any assertions' in the test file. I checked the user table but nothing change. Can someone help me? Thank you

<?php

namespace Tests\Feature;

use App\Models\Post;
//use http\Client\Curl\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\User;

class PostExampleTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    {
        $post = Post::factory()->create();
        //Create 20 more posts
        $post1 = Post::factory()->count(20)->create();

        $post->title = 'Post Test';
        $post->save();

        //Create 10 more users
        $makeTenUsers = User::factory()->count(10)->create();
    $user = User::find(1);
    $user->name = 'Kaeith';
    $user->save();

    //Mass Updates
    User::where('email_verified_at', '2021-02-28 23:50:21')
        ->update(['email'=>'kaeith']);

    //Examining Attribute Changes
    $post->isDirty();
    $post->isDirty('title');

    $user->isClean();
    $user->isClean('name');
}
}

The structure of the user table is 'id', 'name', 'email', 'email_verified_at', 'password', 'created_at'

Upvotes: 0

Views: 267

Answers (1)

IGP
IGP

Reputation: 15879

Well, You are not making any assertions. isDirty()/isClean() just return booleans. None of these:

$post->isDirty();
$post->isDirty('title');

$user->isClean();
$user->isClean('name');

are assertions. This is an assertion.

// $this being the class that extends Tests\TestCase
$this->assertEquals($post->isDirty(), false);

In your code:

  • $post->isDirty(); should be equal to false because the $post's changes have already been saved ($post->save();)
  • $post->isDirty('title'); same with this.

Mass updates don't change and save each model. They bypass eloquent's events entirely. With that in mind:

  • $user->isClean(); should be equal to true because the $user's changes have already been saved ($user->save();)
  • $user->isClean('name'); same with this.
User::factory()->create();

$user = User::first();
$user->isClean();        // true
$user->isClean('name');  // true
$user->isClean('email'); // true
$user->isDirty();        // false
$user->isDirty'name');   // false
$user->isDirty('email'); // false

$user->name .= 'a';
$user->isClean();        // false
$user->isClean('name');  // false
$user->isClean('email'); // true
$user->isDirty();        // true
$user->isDirty'name');   // true
$user->isDirty('email'); // false

$user->save();
$user->isClean();        // true
$user->isClean('name');  // true
$user->isClean('email'); // true
$user->isDirty();        // false
$user->isDirty'name');   // false
$user->isDirty('email'); // false

With simple assertEquals assertion

User::factory()->create();

$user = User::first();
$this->assertEquals($user->isClean(), true);
$this->assertEquals($user->isClean('name'), true);
$this->assertEquals($user->isClean('email'), true);
$this->assertEquals($user->isDirty(), false);
$this->assertEquals($user->isDirty'name'), false);
$this->assertEquals($user->isDirty('email'), false);

$user->name = 'a';
$this->assertEquals($user->isClean(), false);
$this->assertEquals($user->isClean('name'), false);
$this->assertEquals($user->isClean('email'), true);
$this->assertEquals($user->isDirty(), true);
$this->assertEquals($user->isDirty'name'), true);
$this->assertEquals($user->isDirty('email'), false);

$user->save();
$this->assertEquals($user->isClean(), true);
$this->assertEquals($user->isClean('name'), true);
$this->assertEquals($user->isClean('email'), true);
$this->assertEquals($user->isDirty(), false);
$this->assertEquals($user->isDirty'name'), false);
$this->assertEquals($user->isDirty('email'), false);

Upvotes: 0

Related Questions