我正在使用 Ginkgo(和 Gomega)包進行單元測試 Go(lang) Rest API。我需要使用全局設置,這應該可以通過定義來實現var _ = BeforeSuite(func() {...})然后每個規范(具體<file>_test.go)應該在這個全局設置之后運行。不幸的是,我不能讓這發生......我的套件文件名是handlers_suite_test.go,我的第一個測試規范名稱是cartContentsHandler_test.go. 在我看來,銀杏運行在字母順序使得測試文件cartContentsHandler_test.go運行前 handlers_suite_test.go。我已經log()對這兩個文件進行了一些調用,不幸的是他們只是確認了我的發現......這真是令人不快的情況,因為我根本無法運行我的測試......我需要確保httptest.Server在所有規范之前設置和運行數據庫池連接。您知道如何使suite_test 作為測試規范之前的第一個文件運行嗎?(我已經嘗試將套件文件命名為 as,_suite_test.go但在這種情況下,套件似乎根本沒有執行)。我的handlers_suite_test.go:package handlers_testimport ( "<PROJ>/config" "<PROJ>/lib" "<PROJ>/router" "github.com/gorilla/mux" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "log" "net/http/httptest" "os" "testing")var r *mux.Routervar s *httptest.Servervar serverURL stringfunc TestHandlers(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Caracal Handlers Suite")}var _ = BeforeSuite(func() { r = router.NewRouter() s = httptest.NewServer(r) Expect(len(s.URL)).To(BeNumerically(">", 0)) serverURL = s.URL log.Print("###" + serverURL + "###\n\n") // ==> THIS PRINTS MUCH LATER AFTER log.Print() in cartContentsHandler_test.go cwd, _ := os.Getwd() cfg := config.ReadCfg(cwd + "/../config/config.json").DB lib.DB = lib.InitDB(cfg) err := lib.DB.Ping() Expect(err).NotTo(HaveOccurred())})var _ = AfterSuite(func() { // lib.DB.Close() // ==> this was running into Panic... s.Close()})
2 回答

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
發生的事情是BeforeSuite
注冊一個將在測試套件之前執行的函數,并It
注冊一個將成為測試套件一部分的測試函數。對Describe
和的回調Context
立即執行。所以你必須把所有依賴的東西都BeforeSuite
放到It
.

慕妹3146593
TA貢獻1820條經驗 獲得超9個贊
為了保證在塊BeforeSuite的本地設置之前運行必要的全局設置Describe,您應該使用BeforeEach:
在您的套房中:
var serverURL string
var _ = BeforeSuite(func() {
r = router.NewRouter()
s = httptest.NewServer(r)
serverURL = s.URL
})
并在測試中:
var _ = Describe("Handlers/CartContentsHandler", func() {
var url url.URL
BeforeEach(func() {
url = serverURL + "/cart-contents"
})
It("Makes a GET request", func() {
# ....
})
})
- 2 回答
- 0 關注
- 279 瀏覽
添加回答
舉報
0/150
提交
取消