gpt4 book ai didi

php - Laravel/PHP 单元 : Asserting sameness of two models

转载 作者:可可西里 更新时间:2023-11-01 00:08:05 24 4
gpt4 key购买 nike

在 Laravel 中进行集成测试(使用数据库)时。断言同一 Eloquent 模型的两个实例相同的最佳方法是什么?

AssertEquals $模型 $model

简单地使用 ->assertEquals($modelOne, $modelTwo); 不会工作,因为即使它们 相同的 PHPUnit 检查类属性,例如 wasRecentlyCreated 有时模型 id 可以是字符串或整数。

AssertEquals $model->id $model->id

这里的问题是模型一个可能是另一个模型的实例,例如:

AssertEquals(Person::find(1)->id, Animal::find(1)->id); 返回 true。

断言相等 $model->toArray() $model->toArray()

这里的问题是属性并不总是转换为相同的类型,我不是 100% 确定为什么,但有时模型属性将是一个 int 而其他时候是一个数字 string

AssertEquals($address->toArray(), $user->address->toArray())

[ postcode => 2454 ]
[ postcode => "2454" ]

如何以简单、干净和可重复的方式断言两个 Eloquent 模型是相同的数据库记录?

最佳答案

一种选择是在 Illuminate\Database\Eloquent 类上结合使用 PHPUnit 的 assertTrue 方法和 is 方法。

$this->assertTrue($modelOne->is($modelTwo));

如果您作为参数传递的模型不是 null,具有相同的主键、相同的表和相同的连接,则 is 方法将返回 true。

关于测试属性的相同性,您只需在每个模型的属性上使用 PHPUnit 的 assertEquals 就应该是安全的,您可以使用 getAttributes 检索这些属性。

$model1 = new Model(['id' => 1, 'name' => 'test', 'enabled' => 0, 'number' => '1']);
$model2 = new Model(['id' => 1, 'name' => 'test', 'enabled' => false, 'number' => 1]);

$this->assertEquals($model1->getAttributes(), $model2->getAttributes());

在我的测试中,我发现这些断言通过了。 assertEquals 方法松散地比较值,因为使用 == 而不是严格的比较(或身份)运算符 === 来比较值>。在内部,它将对提供的两个数组进行排序,并松散地比较具有相同键的值。如果您在一个模型上有任何额外的属性而在另一个模型上没有,断言也会失败。

关于php - Laravel/PHP 单元 : Asserting sameness of two models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49416444/

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