我不明白 API 测试 (laravel 8) 会发生什么。
这个调用(一个非常简单的 put)返回一个响应 200 ,使用 postman。
同样的测试使用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);
}
错误是:
<块引用>我尝试了很多东西,但都没有成功。我真的不明白会发生什么。任何建议将不胜感激。谢谢。
编辑:我的控制器
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?
答案 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);
写的时间比较长,但至少我的测试没问题。