Asked Mar 2nd, 2020 9:21 a.m. 100 0 3
  • 100 0 3
+1

Viết Feature Test trong PhpUnit trong Laravel với route::patch

Share
  • 100 0 3

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ó).

Mar 2nd, 2020 9:41 a.m.

'id' => $profile->id $profile lấy user_id chứ nhỉ bạn ơi

0
| Reply
Share
Avatar Ashen @Hungpv-ashen
Mar 2nd, 2020 9:53 a.m.

Đ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 ạ

0
| Reply
Share

3 ANSWERS


Answered Mar 2nd, 2020 9:33 a.m.
0

đầ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à ở đó .

Share
Answered Mar 2nd, 2020 9:36 a.m.
0
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());

    }
Share
Avatar Ashen @Hungpv-ashen
Mar 2nd, 2020 9:46 a.m.

@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 ạ

+1
| Reply
Share
Avatar Quang Anh @anhnq98
Mar 2nd, 2020 10:00 a.m.

@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.

0
| Reply
Share
Avatar Ashen @Hungpv-ashen
Mar 2nd, 2020 10:01 a.m.

Đầu vào của em chỉ có 3 trường fisrt_name, last_name, phone đó thôi ạ

+1
| Reply
Share
Avatar Ashen @Hungpv-ashen
Mar 2nd, 2020 10:03 a.m.

Đây là ảnh khi em test bằng postman ạ patch.PNG

+1
| Reply
Share
Avatar Quang Anh @anhnq98
Mar 2nd, 2020 10:07 a.m.

@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ỉ .

0
| Reply
Share
Avatar Ashen @Hungpv-ashen
Mar 2nd, 2020 10:13 a.m.

@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.

0
| Reply
Share
Avatar Quang Anh @anhnq98
Mar 2nd, 2020 10:16 a.m.

@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é .

0
| Reply
Share
Avatar Ashen @Hungpv-ashen
Mar 2nd, 2020 10:19 a.m.

@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.

0
| Reply
Share
Avatar Quang Anh @anhnq98
Mar 2nd, 2020 10:31 a.m.

@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 .

0
| Reply
Share
Answered Mar 2nd, 2020 10:53 a.m.
-1

Có vẻ em đã tìm được câu trả lời cho lỗi này. patch.PNG

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.

Share
Viblo
Let's register a Viblo Account to get more interesting posts.