簡體   English   中英

Laravel / PHPUnit:斷言兩個模型的相同性

[英]Laravel / PHPUnit: Asserting sameness of two models

在Laravel中進行集成測試(使用數據庫)時。 斷言同一個Eloquent模型的兩個實例是一樣的最好的方法是什么?

AssertEquals $model $model

只需使用->assertEquals($modelOne, $modelTwo); 即使它們相同的PHPUnit檢查類屬性,例如wasRecentlyCreated ,有時模型id也可以是字符串或整數。

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模型是相同的數據庫記錄?

一種選擇是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM