为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?

Posted

技术标签:

【中文标题】为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?【英文标题】:Why when I run my phpunit test I get an empty response but the same route/user in Postman behaves as expected?为什么当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期? 【发布时间】:2019-05-22 08:50:00 【问题描述】:

在编写 API 测试时,路由 api/users 应该返回用户列表。 在 Postman 中正常工作,但在我的 phpunit 测试中返回状态 200,但响应为空,因此 assertJsonStructure() 失败。

我为 Postman 和 phpUnit 使用了相同的用户名/密码。 我添加了 dd() 试图调试响应并获得一个空的正文。

测试

/** @test */                                                                                                                                                  
         public function testUserCanListUsers()                                                                                                                        
                                                                                                                                                                      
         ┆   $user = factory(User::class)->make();                                                                                                                     
         ┆   \Auth::loginUsingId($user);                                                                                                                               
         ┆   $response = $this->actingAs($user)                                                                                                                        
         ┆   ┆   ->get('api/users')                                                                                                                                    
         ┆   ┆   ->assertStatus(200);                                                                                                                                  
         |   dd($response->getContent());                                                                                                                              
         ┆   $response->assertJsonStructure([                                                                                                                          
         ┆   ┆   "id",                                                                                                                                                 
         ┆   ┆   "name",                                                                                                                                               
         ┆   ┆   "email",                                                                                                                                              
         ┆   ┆   "email_verified_at",                                                                                                                                  
         ┆   ┆   "created_at",                                                                                                                                         
         ┆   ┆   "updated_at",                                                                                                                                         
         ┆   ]);                                                                                                                                                       
              

我在 Postman 上得到的预期输出

[
    
        "id": 1,
        "name": "Dr. Frederic Klein",
        "email": "vanessa.jacobi@example.org",
        "email_verified_at": "2018-10-31 20:03:52",
        "created_at": "2018-10-31 20:03:52",
        "updated_at": "2018-10-31 20:03:52"
    ,
    
        "id": 2,
        "name": "Prof. Alyce Considine",
        "email": "florence72@example.net",
        "email_verified_at": "2018-10-31 20:03:52",
        "created_at": "2018-10-31 20:03:52",
        "updated_at": "2018-10-31 20:03:52"
    ,
    
        "id": 3,
        "name": "Miss Jermaine Johns PhD",
        "email": "kenyon.stehr@example.net",
        "email_verified_at": "2018-10-31 20:03:52",
        "created_at": "2018-10-31 20:03:52",
        "updated_at": "2018-10-31 20:03:52"
    ,...

我在 phpUnit 上得到的输出 当我 dd($response); “[]”

【问题讨论】:

【参考方案1】:

factory()->make() 方法不会在数据库中保存记录。因此,当您在测试中进行 api 调用时,您没有任何用户,因此响应为空。

factory()->create() 用于实际保存记录。因此,只需将您的 factory()->make() 更改为 factory()->create(),您就会在回复中获得用户。

【讨论】:

谢谢。你是对的,这是一个愚蠢的错误。 code Sebastian Bergmann 和贡献者的 PHPUnit 7.4.3。 "["id":1,"name":"Rhianna Terry","email":"abdullah40@example.com","email_verified_at":"2018-12-23 01:29:09","created_at" :"2018-12-23 01:29:09","updated_at":"2018-12-23 01:29:09"]" code 这是我的转储的预期输出。现在我无法验证 json,但那是另一回事;)。

以上是关于为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?的主要内容,如果未能解决你的问题,请参考以下文章

phpunit 测试返回 302 验证错误,为啥不返回 422

在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率

Laravel phpunit 没有得到正确的网址

在 Laravel 8 中运行多个 PHPUnit 测试时出错

为啥 Laravel 中的 PHPUnit 不能访问存在的路由?

为啥我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”?