作者:Bd专业8楼nv | 来源:互联网 | 2022-12-23 14:47
在Laravel中进行集成测试(使用数据库)时.断言同一个Eloquent模型的两个实例是一样的最好的方法是什么?
的assertEquals $model $model
简单地使用就->assertEquals($modelOne, $modelTwo);
不会工作,即使它们是相同的PHPUnit检查类属性,例如wasRecentlyCreated
有时模型id
s可以是字符串或整数.
的assertEquals $model->id $model->id
这里的问题是模型一可能是另一个模型的实例,例如:
AssertEquals(Person::find(1)->id, Animal::find(1)->id);
返回true.
的assertEquals $model->toArray() $model->toArray()
这里的问题是属性并不总是被转换为相同的类型,我不是100%确定为什么,但有时模型属性将是一个int
和其他时间的数字string
AssertEquals($address->toArray(), $user->address->toArray())
[ postcode => 2454 ]
[ postcode => "2454" ]
如何以简单,干净和可重复的方式断言两个Eloquent模型是相同的数据库记录?
Jonathon..
11
一种选择是使用PHPUnit的assertTrue
方法与组合is
的方法Illuminate\Database\Eloquent
类.
$this->assertTrue($modelOne->is($modelTwo));
is
如果作为参数传递的模型不是null
,具有相同的主键,相同的表和相同的连接,则该方法将返回true .
关于测试属性的相同性,您应该assertEquals
在每个模型的属性上使用PHPUnit是安全的,您可以使用它来检索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
方法松散地比较值,因为值被比较为使用==
而不是严格比较(或标识)运算符===
.在内部,它将对提供的两个数组进行排序,并使用相同的键松散地比较值.如果在一个模型上有任何额外的属性而在另一个模型上没有,则断言也将失败.
1> Jonathon..:
一种选择是使用PHPUnit的assertTrue
方法与组合is
的方法Illuminate\Database\Eloquent
类.
$this->assertTrue($modelOne->is($modelTwo));
is
如果作为参数传递的模型不是null
,具有相同的主键,相同的表和相同的连接,则该方法将返回true .
关于测试属性的相同性,您应该assertEquals
在每个模型的属性上使用PHPUnit是安全的,您可以使用它来检索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
方法松散地比较值,因为值被比较为使用==
而不是严格比较(或标识)运算符===
.在内部,它将对提供的两个数组进行排序,并使用相同的键松散地比较值.如果在一个模型上有任何额外的属性而在另一个模型上没有,则断言也将失败.