【问题标题】:Test api returns 201 instead 200测试 api 返回 201 而不是 200
【发布时间】:2021-06-07 02:02:11
【问题描述】:

我不明白 API 测试 (laravel 8) 会发生什么。

这个调用(一个非常简单的 put)返回一个响应 200 ,使用邮递员。

使用 phpunit 进行相同的测试,返回 201 :

public function testPutOrganizationOk()
{
    $organization = Organization::factory()->create();

    $superAdmin = User::factory()->create([
        'organization_id' => $organization->id,
        'role_id' => 'SUPERADMIN'
    ]);

    Sanctum::actingAs($superAdmin);

    $organizationToModify = [
        'name' => 'mon organization moif',
        'contact' => 'contact name modif',
        'comment' => 'comment comment comment modif',
        'ads_max' => 12345,
        'state_id' => 'VALIDATED'
    ];

    $response = $this->putJson($this->getUrl() . '/organizations/' . $organization->id, $organizationToModify);

    $response->assertStatus(200);
}

错误是:

  1. Tests\Feature\OrganizationTest::testPutOrganizationOk 预期状态代码 200 但收到 201。未能断言 200 是 与 201 相同。

我尝试了很多东西,但没有成功。我真的不明白会发生什么。任何建议将不胜感激。谢谢。

编辑:我的控制器

public function update(StoreOrganizationRequest $request, Organization $organization)
    {
        $this->authorize('update', Organization::class);

        $organizationUpdated = $this->organizationRepository->updateOrganization($organization, $request->only(['name', 'contact', 'comment', 'ads_max', 'state_id']));

        return new OrganizationResource($organizationUpdated);
    }

7 小时后编辑 ;-)

当我在控制器中通过返回一个简单的 json 来替换资源的返回时,我在 postman 和 phpunit 之间有相同的行为。 api 调用收到 200 的更新。

奇怪,问题出在资源周围?

为什么 postman 和 phpunit 之间的行为不同?谁是对的:邮递员还是 phpunit?

【问题讨论】:

  • putJson 而不是 put :)
  • 我尝试了很多东西:$this->json('PUT'....,还有 $this->put,还有 $this->putJson。每次我都有相同的 201 而不是 200。但感谢您的帮助。
  • 在您的组织控制器中,尝试指定响应代码?
  • 请出示您的控制器代码。你在使用Resource 类吗?
  • 我刚刚阅读了这个主题laraveldaily.com/…,它解释说:注意,如果我们不指定返回的状态码,Laravel 会自动为我们做,这可能是不正确的.因此建议尽可能指定代码。

标签: laravel


【解决方案1】:

http代码201,表示创建成功。 看这里developer.mozilla.org

您可以通过以下方式自定义标头代码:

return Response::json(new OrganizationResource($organizationUpdated), 200);

【讨论】:

  • 谢谢卡卡达,我知道。我的问题是“为什么邮递员中的 api 调用和 phpunit 中的相同调用之间存在不同的行为”?
【解决方案2】:

201 状态码表示您只是创建了一个实例,并且 200 状态码表示已经存在的实例已经更新

PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。如果 Request-URI 引用一个已经存在的资源,封闭的实体应该被认为是在源服务器上的一个修改版本。如果 Request-URI 不指向现有资源,并且该 URI 能够被请求用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。"

我可能错了,但您似乎先创建了实例并尝试修改它

【讨论】:

    【解决方案3】:

    最后,我放弃了!

    我会用这样的状态码来写响应:

    return (new OrganizationResource($organization))->response()->setStatusCode(200);
    

    代替:

    return new OrganizationResource($organization);
    

    写的比较长,但至少我的测试还可以。

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2019-08-01
      • 2022-01-07
      • 2020-11-21
      • 2020-08-22
      • 2022-10-20
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多