Gin: test_helpers.go harus diberi nama helpers_test.go

Dibuat pada 7 Apr 2016  ·  20Komentar  ·  Sumber: gin-gonic/gin

test_helpers.go dibuat dengan paket. Ini harus dibangun hanya saat pengujian yang berarti harus memiliki akhiran _test.go . Satu efek sampingnya adalah bahwa dengan test_helpers.go menggunakan httptest setiap program yang menggunakan gin mendapat -httptest.serve bendera.

package main

import (
    "flag"
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    rtr := gin.Default()
    rtr.GET("/", func(ctx *gin.Context) {
        ctx.String(http.StatusOK, "Hi")
    })
    flag.Parse()
    rtr.Run(":8080")
}

Sekarang jalankan program dengan --help dan Anda akan melihat:

$ go run /tmp/t.go --help
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
Usage of /tmp/go-build903640301/command-line-arguments/_obj/exe/t:
  -httptest.serve string
        if non-empty, httptest.NewServer serves on this address and blocks
exit status 2
$
bug

Komentar yang paling membantu

Ada kebutuhan untuk menamainya sebagai test_helpers.go bukan helpers_test.go. Pengujian unit pada paket yang menggunakan gin perlu membuat konteks pengujian. Dengan mengganti namanya menjadi helpers_test.go CreateTestContext () menjadi pribadi.

Karena CreateTestContext () merujuk ke metode privat, pengguna paket sekarang tidak dapat membuat konteks pengujiannya sendiri.

Semua 20 komentar

@tebeka terima kasih telah memperhatikan ini, menggabungkan # 581

Ada kebutuhan untuk menamainya sebagai test_helpers.go bukan helpers_test.go. Pengujian unit pada paket yang menggunakan gin perlu membuat konteks pengujian. Dengan mengganti namanya menjadi helpers_test.go CreateTestContext () menjadi pribadi.

Karena CreateTestContext () merujuk ke metode privat, pengguna paket sekarang tidak dapat membuat konteks pengujiannya sendiri.

@roylou saya tidak tahu itu, ada sumber daya yang dapat saya periksa?

Dengan mengganti namanya menjadi helpers_test.go CreateTestContext () menjadi pribadi.

Bahkan ketika huruf pertama dari nama fungsinya adalah kapital?

@javierprovecho sayangnya saya tidak dapat menemukan sumber daya web apa pun. Ini dengan eksplorasi diri.

Jika Anda menjalankan "go test" dari foo_test.go berikut:

package foo

import (
    "fmt"
    "github.com/gin-gonic/gin"
)

func TestCreateContext() {
    c, w, r := gin.CreateTestContext()
    fmt.Println(c, w, r)
}

Ini akan mengeluh
./foo_test.go:9: undefined: gin.CreateTestContext

Mungkin pindahkan ini ke paket "github.com/gin-gonic/gin/test"? Dengan cara ini orang akan dapat menggunakannya dalam pengujian tetapi tidak akan muncul dengan kode aplikasi menggunakan gin?

Sayangnya ini tidak akan berhasil. CreateTestContext () menjalankan beberapa fungsi pribadi gin. Mengeluarkannya dari github.com/gin-gonic/gin akan memblokir aksesibilitas fungsi pribadi.

Saya pikir mengekspos bendera -httptest.serve adalah trade-off yang layak diberikan aturan golang hari ini. Program Anda sudah menunjukkan 100+ flag tergantung pada jumlah lib pihak ketiga. 90% dari mereka Anda tidak terlalu peduli. Menambahkan tanda uji ke dalam 90% itu tidak ideal tetapi dapat ditoleransi bagi saya.

Saya tidak setuju. Saya pikir kita harus menemukan API yang lebih bersih dan membuatnya berfungsi.

Penggabungan # 581 telah merusak pengujian saya karena mereka mengandalkan CreateTestContext (). Apakah ada solusinya?

Tampaknya ada pertukaran antara kebersihan API dan kemampuan untuk bersaksi. Beri tahu saya jika ada cara yang lebih baik untuk mempertahankan testibilitas. Tanpa CreateTestContext (), saya harus benar-benar memulai server http palsu alih-alih menguji fungsi router gin saya.

Saya juga merindukan keberadaan fungsi ini. Fakta bahwa penangan gin hanya perlu mengambil Konteks adalah bagian yang membuat saya tertarik. Kurangnya cara mudah untuk membuat konteks untuk tujuan pengujian tampaknya seperti kemunduran bagi saya.

Saya menebak dari kurangnya minat pada masalah ini, kode aplikasi yang menggunakan gin tetap tidak dapat diuji?

IMO kita harus kembali ke keadaan lama di mana CreateTestContext diekspos sampai kita menemukan cara yang lebih baik / lebih bersih untuk melakukannya. Ada keberatan?

Itu bagus untukku - terima kasih.

Anda dapat menggunakan fungsi gin ServeHTTP untuk mensimulasikan permintaan:

func getGinRouter() *gin.Engine {
    r := gin.Default()
    r.Post("/", func (c *gin.Context) { c.String(200, "Hello") })
    return r
}

func newTestContext(method, path string) (w *httptest.ResponseRecorder, r *http.Request) {
    w = httptest.NewRecorder()
    r, _ = http.NewRequest(method, path, nil)
    r.PostForm = url.Values{}
    return
}

func TestIndex(t *testing.T) {
    w, r := newTestContext("POST", "/")
    r.PostForm.Add("a_param", "a_value")
    getGinRouter().ServeHTTP(w, r)
    assert.Equal(t, 200, w.Code)
    assert.Equal(t, "Hello", w.Body.String())
}

Saya hanya kehilangan kemampuan untuk mengakses konteks gin dalam pengujian saya. Jika tidak, itu bekerja dengan sangat baik.

Sebuah bagian tentang bagaimana menulis tes dengan Gin akan menjadi penting bagi pengguna baru.

Mengapa tidak menghasilkan CreateTestContext() untuk menerima objek http.ResponseWriter ?

func CreateTestContext(w http.ResponseWriter) (c *Context, r *Engine) {
    r = New()
    c = r.allocateContext()
    c.reset()
    c.writermem.reset(w)
    return
}

Saat menguji, buat httptest.NewRecorder() dan berikan ke CreateTestContext()

w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)

Ini berarti test_helpers.go tidak perlu mengimpor net/http/httptest

ada pembaruan tentang itu? perlu ini func CreateTestContext yang diekspor

Saya juga memerlukan CreateTestContext untuk menguji penangan saya secara independen dari router / aplikasi http. Ada pembaruan?

Halo semuanya, sudah diperbaiki oleh https://github.com/gin-gonic/gin/pull/707

Apakah halaman ini membantu?
0 / 5 - 0 peringkat