【问题标题】:Unit Testing controller in laravel 8laravel 8 中的单元测试控制器
【发布时间】:2021-02-17 11:31:23
【问题描述】:

我对 Laravel 测试非常陌生,我正在使用 laravel 8,我想测试的功能是:

当我运行我的测试时,我得到了这个错误:

ErrorException: 试图获取非对象的属性 'id'

感谢您的帮助!

【问题讨论】:

  • 我认为这可能会有所帮助:stackoverflow.com/a/50709981/9920875,因为我还认为您可能传递了错误的请求命名空间。
  • 谢谢,但我定义了“使用 Illuminate\Http\Request;”在我的测试功能中,我认为这不应该是问题。
  • @Johhn 如果是这样的话,PHP 会抱怨参数与函数签名不匹配
  • 什么是$this->user,它在哪里定义?请将此代码添加到您的问题中。
  • 每个订单都有一个 user_id 并且为了创建我们需要建立与用户的连接的订单,我为了生成用户我使用了“userFactory”为我生成用户同时测试。

标签: php laravel phpunit laravel-sanctum


【解决方案1】:

通常您甚至不需要在测试中使用 Request 类。

public function testStore()
{
    Sanctum::actingAs($this->user, ['*']);

    $response = $this->postJson('/order/store', [
        'doAssigned' => false,
        'doValidate' => false,
    ]);

    $response->assertJsonPath('status', 'draft');
} 

【讨论】:

  • 非常感谢您的帮助,但我不明白您所说的“端点”是什么意思,在我的 'api.php' 中有:Route::apiResource('order', 'OrderController');
  • 在我的api.php 中我添加了Route::get('order/store', 'OrderController@store'); 行,但我收到了错误InvalidArgumentException: Action App\Http\Controllers\App\Http\Controllers\OrderController@store not defined.
  • 端点是order/store。您遇到的错误与命名空间有关。您可以尝试 action('OrderController@store') 而不是 action('App\Http\Controllers\OrderController@store'),但您可以直接将端点放在测试中。我刚刚编辑了它。