gpt4 book ai didi

php - Laravel 5.1 单元测试中的模拟 hasMany 关系

转载 作者:行者123 更新时间:2023-12-02 05:46:52 24 4
gpt4 key购买 nike

对于 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。这是一个非常简单的测试用例,您可以根据您想要实现的目标以您喜欢的方式扩展它。

关于php - Laravel 5.1 单元测试中的模拟 hasMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46548123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com