آزمایش هندلر snippetCreate (Testing the snippetCreate Handler)
هدف شما در این تمرین ایجاد یک تست انتها به انتها (End-to-End Test) برای مسیر (Route) GET /snippet/create است. به طور خاص، میخواهید آزمایش کنید که:
- کاربران غیرمجاز (Unauthenticated Users) به فرم ورود (Login Form) هدایت میشوند.
- کاربران مجاز (Authenticated Users) فرم ایجاد یک قطعه جدید را مشاهده میکنند.
مرحله 1
یک تست جدید (New Test) TestSnippetCreate در فایل cmd/web/handlers_test.go خود ایجاد کنید. در این تست، از الگو (Pattern) و توابع کمکی (Helper Functions) فصل تست انتها به انتها برای راهاندازی یک سرور تست (Test Server) جدید با استفاده از مسیرهای برنامه و وابستگیهای شبیهسازی شده (Mocked Dependencies) استفاده کنید.
مرحله 2
یک زیرتست (Subtest) با نام "Unauthenticated" ایجاد کنید. در این زیرتست، یک درخواست GET (GET Request) به /snippet/create به سرور تست به عنوان یک کاربر غیرمجاز ارسال کنید. تأیید کنید که پاسخ (Response) دارای کد وضعیت (Status Code) 303 و یک هدر (Header) Location: /user/login است.
مرحله 3
یک زیرتست دیگر با نام "Authenticated" ایجاد کنید. در این زیرتست، جریان ورود (Login Flow) به سیستم به عنوان یک کاربر برای احراز هویت را شبیهسازی کنید. به طور خاص، باید یک درخواست GET /user/login ارسال کنید، توکن CSRF (CSRF Token) را از بدنه پاسخ (Response Body) استخراج کنید، سپس یک درخواست POST (POST Request) به /user/login با استفاده از اعتبارنامهها (Credentials) ارسال کنید.
سپس پس از احراز هویت، یک درخواست GET /snippet/create ارسال کنید و تأیید کنید که کد وضعیت 200 و یک بدنه HTML شامل متن <form action='/snippet/create' method='POST'> دریافت میکنید.
کد پیشنهادی
Suggested code for step 1
... func TestSnippetCreate(t *testing.T) { app := newTestApplication(t) ts := newTestServer(t, app.routes()) defer ts.Close() }
Suggested code for step 2
... func TestSnippetCreate(t *testing.T) { app := newTestApplication(t) ts := newTestServer(t, app.routes()) defer ts.Close() t.Run("Unauthenticated", func(t *testing.T) { code, headers, _ := ts.get(t, "/snippet/create") assert.Equal(t, code, http.StatusSeeOther) assert.Equal(t, headers.Get("Location"), "/user/login") }) }
$ go test -v -run=TestSnippetCreate ./cmd/web/
=== RUN TestSnippetCreate
=== RUN TestSnippetCreate/Unauthenticated
--- PASS: TestSnippetCreate (0.01s)
--- PASS: TestSnippetCreate/Unauthenticated (0.00s)
PASS
ok snippetbox.alexedwards.net/cmd/web 0.010s
Suggested code for step 3
... func TestSnippetCreate(t *testing.T) { app := newTestApplication(t) ts := newTestServer(t, app.routes()) defer ts.Close() t.Run("Unauthenticated", func(t *testing.T) { code, headers, _ := ts.get(t, "/snippet/create") assert.Equal(t, code, http.StatusSeeOther) assert.Equal(t, headers.Get("Location"), "/user/login") }) t.Run("Authenticated", func(t *testing.T) { // Make a GET /user/login request and extract the CSRF token from the // response. _, _, body := ts.get(t, "/user/login") csrfToken := extractCSRFToken(t, body) // Make a POST /user/login request using the extracted CSRF token and // credentials from our the mock user model. form := url.Values{} form.Add("email", "alice@example.com") form.Add("password", "pa$$word") form.Add("csrf_token", csrfToken) ts.postForm(t, "/user/login", form) // Then check that the authenticated user is shown the create snippet // form. code, _, body := ts.get(t, "/snippet/create") assert.Equal(t, code, http.StatusOK) assert.StringContains(t, body, "<form action='/snippet/create' method='POST'>") }) }
$ go test -v -run=TestSnippetCreate ./cmd/web/
=== RUN TestSnippetCreate
=== RUN TestSnippetCreate/Unauthenticated
=== RUN TestSnippetCreate/Authenticated
--- PASS: TestSnippetCreate (0.01s)
--- PASS: TestSnippetCreate/Unauthenticated (0.00s)
--- PASS: TestSnippetCreate/Authenticated (0.00s)
PASS
ok snippetbox.alexedwards.net/cmd/web 0.012s
واژهنامه اصطلاحات فنی
| اصطلاح فارسی | معادل انگلیسی | توضیح |
|---|---|---|
| تست انتها به انتها | End-to-End Test | آزمایش کامل عملکرد برنامه |
| مسیر | Route | آدرس دسترسی به صفحه |
| کاربران غیرمجاز | Unauthenticated Users | کاربران وارد نشده به سیستم |
| کاربران مجاز | Authenticated Users | کاربران وارد شده به سیستم |
| فرم ورود | Login Form | صفحه ورود به سیستم |
| تست جدید | New Test | آزمون تازه ایجاد شده |
| الگو | Pattern | ساختار تکرارشونده |
| توابع کمکی | Helper Functions | توابع کمکی برای تست |
| سرور تست | Test Server | سرور مخصوص آزمایش |
| وابستگیهای شبیهسازی شده | Mocked Dependencies | وابستگیهای مجازی برای تست |
| زیرتست | Subtest | بخش کوچکتر از تست اصلی |
| درخواست GET | GET Request | درخواست دریافت اطلاعات |
| پاسخ | Response | پاسخ سرور به درخواست |
| کد وضعیت | Status Code | کد نشاندهنده وضعیت پاسخ |
| هدر | Header | اطلاعات اضافی درخواست/پاسخ |
| جریان ورود | Login Flow | فرآیند ورود به سیستم |
| توکن CSRF | CSRF Token | توکن امنیتی فرم |
| بدنه پاسخ | Response Body | محتوای اصلی پاسخ |
| درخواست POST | POST Request | درخواست ارسال اطلاعات |
| اعتبارنامهها | Credentials | اطلاعات ورود به سیستم |