【问题标题】:Laravel 5: fresh() on a model doesn't work in PHPUnitLaravel 5:模型上的 fresh() 在 PHPUnit 中不起作用
【发布时间】:2018-08-09 05:04:32
【问题描述】:

我一直在尝试在测试中重新加载模型。

我一直在使用fresh(),由于某种原因它在测试中不起作用。 (可能这是一个错误)

这是一个sn-p。

//There is a relationship between Order and OrderItem.
//One Order hasMany OrderItem

$order    = factory(Order::class)->create([...]);
$orderItem = factory(OrderItem::class)->create([
    'order_id'    => $order->id,
]);
$response = $this->delete('/api/order/' . $order->id);
$response->assertResponseStatus(200);
//This passes.

$orderItem = $orderItem->fresh();
$this->assertEquals($orderItem->some_attribute, 0);

最后一行的结果是trying to get property of non-object

我变了 $orderItem = $orderItem->fresh(); 进入 $orderItem->fresh();

这种方法根本没有刷新$orderItem

你看到我做错了什么吗?

我们将不胜感激。

附言

$orderItem = OrderItem::find($orderItem->id);

我尝试了这种方法,结果也是trying to get property of non-object

【问题讨论】:

  • 代码看起来也不错。我也觉得是个bug。请问你用的是什么版本?
  • 关于你的最后一点:你得到一个非对象的属性,因为模型不存在,因为删除调用有效。您应该将最终的 find() 更改为 findOrFail(),然后断言 ModelNotFoundException。去掉最后的->id。
  • @Kenth 我使用的是 5.1。也许你会建议使用最新版本,但现在我正在做的是维护一个用 5.1 开发的旧应用程序。

标签: laravel laravel-5 phpunit


【解决方案1】:

factory()返回Illuminate\Database\Eloquent\Factory的实例

它没有实现任何fresh() 方法。

模型实现了fresh() 方法。

fresh(array|string $with = []) //Reload a fresh model instance from the database.

OrderItem::find($orderItem->id);

返回集合。

这是你可以做的。

OrderItem::where('id',  $orderItem->id)->fresh();

参考:

https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Factory.html

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2015-09-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多