Yêu cầu thg 3 2, 2020 9:21 SA 97 0 3
  • 97 0 3
+1

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

Chia sẻ
  • 97 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ó).

thg 3 2, 2020 9:41 SA

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

Avatar Ashen @Hungpv-ashen
thg 3 2, 2020 9:53 SA

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

3 CÂU TRẢ LỜI


Đã trả lời thg 3 2, 2020 9:33 SA
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à ở đó .

Chia sẻ
Đã trả lời thg 3 2, 2020 9:36 SA
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());

    }
Chia sẻ
Avatar Ashen @Hungpv-ashen
thg 3 2, 2020 9:46 SA

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

Avatar Quang Anh @anhnq98
thg 3 2, 2020 10:00 SA

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

Avatar Ashen @Hungpv-ashen
thg 3 2, 2020 10:01 SA

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

Avatar Ashen @Hungpv-ashen
thg 3 2, 2020 10:03 SA

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

Avatar Quang Anh @anhnq98
thg 3 2, 2020 10:07 SA

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

Avatar Ashen @Hungpv-ashen
thg 3 2, 2020 10:13 SA

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

Avatar Quang Anh @anhnq98
thg 3 2, 2020 10:16 SA

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

Avatar Ashen @Hungpv-ashen
thg 3 2, 2020 10:19 SA

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

Avatar Quang Anh @anhnq98
thg 3 2, 2020 10:31 SA

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

Đã trả lời thg 3 2, 2020 10:53 SA
-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.

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí