Laravel / PHPUnit:断言两个模型的相同性

时间:2018-03-21 21:02:19

标签: php laravel testing types phpunit

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

AssertEquals $model $model

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

AssertEquals $model->id $model->id

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

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模型是相同的数据库记录?

1 个答案:

答案 0 :(得分:9)

一种选择是在is类上使用PHPUnit的Illuminate\Database\Eloquent方法和$this->assertTrue($modelOne->is($modelTwo)); 方法。

is

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

关于测试属性的相同性,在每个模型的属性上使用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

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