【问题标题】:Mass Update and Examing Attribute Change are not working (Laravel)批量更新和检查属性更改不起作用(Laravel)
【发布时间】:2021-05-31 11:03:29
【问题描述】:

我有这段代码,我想在用户表上执行批量更新和检查属性更改。但是,当我运行 php artisan 测试时,测试文件中有一个错误说“此测试没有执行任何断言”。我检查了用户表,但没有任何变化。有人能帮我吗?谢谢

<?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');
}
}

user表的结构是'id', 'name', 'email', 'email_verified_at', 'password', 'created_at'

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    好吧,你没有做出任何断言。 isDirty()/isClean() 只返回布尔值。这些都不是:

    $post->isDirty();
    $post->isDirty('title');
    
    $user->isClean();
    $user->isClean('name');
    

    是断言。这是一个断言。

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

    在您的代码中:

    • $post-&gt;isDirty(); 应该等于 false,因为 $post 的更改已保存 ($post-&gt;save();)
    • $post-&gt;isDirty('title'); 与此相同。

    大规模更新不会更改并保存每个模型。他们完全绕过了 eloquent 的事件。考虑到这一点:

    • $user-&gt;isClean(); 应该等于 true,因为 $user 的更改已经保存 ($user-&gt;save();)
    • $user-&gt;isClean('name'); 与此相同。
    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
    

    使用简单的assertEquals 断言

    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);
    

    【讨论】:

    • 如何同时更新多个列,例如,任何用户在 2021-02-28 拥有 email_verified_at?我进行了大规模更新,但我检查并没有更新
    • 如果您对 users 表进行批量更新,您的模型实例 ($user) 不会更改。它不知道这些变化。进行批量更新后,请执行$user-&gt;fresh() 以再次从数据库中获取它。
    猜你喜欢
    • 2012-12-10
    • 2014-08-24
    • 2023-03-21
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多