首页 > 解决方案 > 为什么当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?

问题描述

在为 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"
    },...

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

邮递员输出

标签: phpjsonlaravelphpunit

解决方案


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

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


推荐阅读