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
$
@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
Harap pertimbangkan PR https://github.com/gin-gonic/gin/pull/707
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
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.