【问题标题】:Laravel / PHPUnit: Asserting sameness of two modelsLaravel / PHPUnit:断言两个模型的相同性
【发布时间】:2018-08-31 04:04:32
【问题描述】:

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

AssertEquals $model $model

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

AssertEquals $model->id $model->id

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

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

AssertEquals $model->toArray() $model->toArray()

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

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

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

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

【问题讨论】:

  • 您只想比较从数据库中获得的新模型吗?
  • 您能否为您要测试的内容添加一些上下文?您是在测试 Model::create() 之类的内容是否正确持久化,还是...?
  • @AkenRoberts 不,我不会,因为这会使这个问题特定于我的用例,而不是 stackoverflow 的用途。这个问题很简单且重点突出,应该保持这种方式

标签: php laravel testing types phpunit


【解决方案1】:

一种选择是将 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 方法比较松散地比较值,因为使用== 而不是严格比较(或身份)运算符=== 比较值。在内部,它将对提供的两个数组进行排序,并松散地比较具有相同键的值。如果您在一个模型上具有任何额外属性,而在另一个模型上没有,则断言也会失败。

【讨论】:

  • 哇,这太棒了,正是我所期望的。虽然在保存记录之前属性可能不同的意义上缺少“相同性”。
  • 有没有人写过一些断言比如assertModelEquals(Model $expected, Model $actual)assertModelSameness(Model $expected, Model $actual)
  • 我认为在每个模型的属性上使用assertEquals 应该是安全的。请查看我的更新答案。
  • toArray 和 getAttributes 有什么区别?
  • getAttributes 只返回表示模型属性的内部数组。 toArray 做的更多,因为它调用 mutators、包含关系、转换属性(由 $casts 属性定义)、省略隐藏(由 $hidden 属性定义)等等。 getAttributes 更简单,它不做任何额外的处理,它只是返回模型所代表的底层数据。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 2020-01-08
  • 2020-02-16
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 2021-02-25
  • 2015-11-06
相关资源
最近更新 更多