Let's Go تمرینات راهنما › آزمایش هندلر snippetCreate
قبلی · فهرست · بعدی
فصل 16.3.

آزمایش هندلر snippetCreate (Testing the snippetCreate Handler)

هدف شما در این تمرین ایجاد یک تست انتها به انتها (End-to-End Test) برای مسیر (Route) GET /snippet/create است. به طور خاص، می‌خواهید آزمایش کنید که:

مرحله 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

File: cmd/web/handlers_test.go
...

func TestSnippetCreate(t *testing.T) {
    app := newTestApplication(t)
    ts := newTestServer(t, app.routes())
    defer ts.Close()
}

Suggested code for step 2

File: cmd/web/handlers_test.go
...

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

File: cmd/web/handlers_test.go
...

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 اطلاعات ورود به سیستم