[英]Laravel / PHPUnit: Asserting sameness of two models
在Laravel中進行集成測試(使用數據庫)時。 斷言同一個Eloquent模型的兩個實例是一樣的最好的方法是什么?
$model $model
只需使用->assertEquals($modelOne, $modelTwo);
即使它們是相同的PHPUnit檢查類屬性,例如wasRecentlyCreated
,有時模型id
也可以是字符串或整數。
$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" ]
一種選擇是使用PHPUnit的assertTrue
方法與Illuminate\\Database\\Eloquent
類上的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
方法松散地比較值,因為值比較為使用==
而不是嚴格比較(或標識)運算符, ===
。 在內部,它將對提供的兩個數組進行排序,並使用相同的鍵松散地比較值。 如果在一個模型上有任何額外的屬性而在另一個模型上沒有,則斷言也將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.