Viết Feature Test trong PhpUnit trong Laravel với route::patch
Em đang viết một Feature Test để check thử việc chỉnh sửa profile của người dùng với phương thức Patch. Code của em như sau :
protected function setHeader($user)
{
$token = $user->createToken('UserAuth')->accessToken;
$header = array(
'Authorization' => "Bearer $token",
'Content-Type' => 'application/x-www-form-urlencoded',
'Accept' => 'application/json',
);
return $header;
}
protected function setParram()
{
$parrams = array(
'first_name' => "Update",
'last_name' => "Profile",
'phone' => "0123456789",
);
return $parrams;
}
public function testUpdateProfileRequired()
{
$email = 'testupdate@profile.com';
$user = factory(User::class)->create([
'email' => $email,
]);
$profile = factory(Profile::class)->create([
'fisrt_name' => 'Profiles',
'user_id' => $user->id,
]);
$parrams = $this->setParram();
// unset($parrams['fist_name']);
$response = $this->json('patch', route('update.profile', ['id' => $profile->id]), $parrams, $this->setHeader($user));
$response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY);
}
Vấn đề em gặp ở đây là có vẻ như em không truyền được giá trị các trường của biến parram nên gây ra việc vẫn nhận đc mã lỗi 422 khi trả về, mặc dù biến parram của em có dữ liệu (em chưa uset() nó).
3 CÂU TRẢ LỜI
đầu tiên bạn json_decode($response) ra xem cấu trúc mảng của nó có gióng như hàm setParram() của bạn k . mình nghĩ vấn đề là ở đó .
protected function setParram()
{
return [
'first_name' => "Update",
'last_name' => "Profile",
'phone' => "0123456789",
]
}
public function testUpdateProfileRequired()
{
$email = 'testupdate@profile.com';
$user = factory(User::class)->create([
'email' => $email,
]);
$profile = factory(Profile::class)->create([
'fisrt_name' => 'Profiles',
'user_id' => $user->id,
]);
// $parrams = $this->setParram();
// unset($parrams['fist_name']);
$response = $this->json('patch', route('update.profile', ['id' => $profile->id]), $this->setHeader($user));
$response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY);
$response->assertJsonStructure($this->setParram());
}
@anhnq98 dạ thưa nêu em cũng biết là nếu không gọi hàm setParram() nữa thì sẽ đúng . Vấn đề ở đây là mặc dù em đã gọi hàm setParram() để set giá trị cho biến $parrams tuy nhiên khi gửi request lên thì vẫn nhận về mã lỗi validate 422, ở đây là chưa truyền fisrt_name, last_name, và phone lên ạ
@Hungpv-ashen thì bạn check ở Request của profile xem yêu cầu đầu vào như thế nào thì bạn sửa lại ở setParram kia là pass validate.
Đầu vào của em chỉ có 3 trường fisrt_name, last_name, phone đó thôi ạ
Đây là ảnh khi em test bằng postman ạ
@Hungpv-ashen pass test thì phải là $response->assertStatus(200) . nhưng mình thấy ở đây của bạn đang trả về $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) . là 422 thì pass sao đc nhỉ .
@anhnq98 như tên hàm ở đây em đang test điều kiện required trong validate nên mã cần trả về là 422. Tuy nhiên trong code khi em gọi hàm setParram(), em đã không unset() bất kì giá trị nào của mảng $parrams nên khi gọi $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) thì kết quả của hàm test em nhận về phải là false chứ không phải true.
@Hungpv-ashen oh mình k nhìn kỹ sorry . vậy thì hàm setparam kia bạn để là rỗng thì sẽ pass test nhé .
@anhnq98 em biết là để rỗng sẽ pass. Cơ mà em muốn biết tại sao nó không nhận được giá trị của $parrams của em, nếu nhận thì hàm test phải là false.
@Hungpv-ashen ủa thì khi bạn thực hiện test gọi đến route(update.profile) , tất nhiên là nó sẽ chạy vào controller xử lý rồi vì thế nên nó không nhận giá trị của $params của bạn thông qua Request $request đó ở function Controller .
Có vẻ em đã tìm được câu trả lời cho lỗi này.
sau khi thay việc setparram thành truyền thẳng vào bằng mảng thì lại thành công. K hiểu lí do.
'id' => $profile->id $profile lấy user_id chứ nhỉ bạn ơi
Đoạn này trong route em để là nhận vào id của profile nên sẽ phải là 'id' => $profile->id ạ