簡體   English   中英

在 Laravel 5.1 單元測試中模擬 hasMany 關系

[英]mocking hasMany relation in laravel 5.1 unit test

對於 laravel 5.1 中的單元測試,我試圖測試客戶端模型的級聯刪除函數,該函數在設置遞歸標志的情況下還應該刪除與客戶端關聯的所有用戶。 我想使用模擬用戶進行測試,僅在調用用戶的刪除功能時才進行測試,因此我不必使用數據庫,並在將來將相同的原理應用於其他測試。

目前測試失敗,因為我找不到讓客戶端模型在不觸發查詢的情況下檢索關聯用戶的方法。 我想我需要模擬客戶端的 hasMany 關系定義函數,但我還沒有找到方法。

客戶端模型:

class Client extends Model
{



    protected $table = 'clients';

    protected $fillable = [];



    public function casDelete($recursive = false){
        if($recursive) {
            $users = $this->users()->get();
            foreach($users as $user) {
                $user->casDelete($recursive);
            }
        }
        $this->delete();
    }

    public function users(){
        return $this->hasMany('App\User');
    }
}

用戶模型:

class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
    use Authenticatable, CanResetPassword;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password', 'client_id'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = ['password', 'remember_token'];

    public function casDelete($recursive = false){
        $this->delete();
    }

    public function client(){
        return $this->belongsTo('App\Client');
    }

}

測試:

class ClientModelTest extends TestCase
{
    use DatabaseTransactions;

    function testCasDelete(){
    $client = factory(Client::class)->create();
    $user = factory(User::class)->make(['client_id' => $client->id]);

    $observer = $this->getMock('user');
    $observer->expects($this->once())->method('casDelete');

    $client->casDelete(true);


    }
}

當您使用 DatabaseTransactions 時,這意味着您希望將數據保存在數據庫中。 當您使用工廠的 create() 時,您仍然在使用數據庫,因此要么根本不使用數據庫,要么希望使用數據庫,那么您可以簡單地解決問題。 但我可以建議的是這個解決方案,我沒有使用數據庫初始化。

    $user = \Mockery::mock();
    $user->shouldReceive('casDelete')->andReturnNull();

    $queryMock = \Mockery::mock();
    $queryMock->shouldReceive('get')->andReturn([$user]);

    $clientMock = \Mockery::mock(Client::class)->makePartial();
    $clientMock->shouldReceive('users')->andreturn($queryMock);
    $clientMock->casDelete(true);

這樣您就可以確定您已經在每個用戶模型上調用了 casDelete。 這是一個非常簡單的測試用例,您可以根據您想要實現的目標以您喜歡的方式擴展它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM