测试 api 返回 201 而不是 200

时间:2021-03-09 07:28:40

标签: laravel

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

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

enter image description here

同样的测试使用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?

3 个答案:

答案 0 :(得分:0)

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

并且您可以通过以下方式自定义标题代码:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

终于放弃了!

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

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

代替:

return new OrganizationResource($organization);

写的时间比较长,但至少我的测试没问题。