运行 Ginkgo 测试套件(任何规范之前的 BeforeSuite 设置 运行
Running Ginkgo test suite (BeforeSuite setup before any spec is ran
我正在使用 Ginkgo(和 Gomega)包进行单元测试 Go(lang) Rest API。
我需要使用全局设置,这应该可以通过定义
来实现
var _ = BeforeSuite(func() {...})
然后每个规范(具体 <file>_test.go
)应该 运行 在这个全局设置之后。不幸的是我无法做到这一点...
我的套件文件名为 handlers_suite_test.go
,我的第一个测试规范名称为 cartContentsHandler_test.go
。在我看来,Ginkgo 运行s 的测试文件按字母顺序排列,使得 cartContentsHandler_test.go
到 运行 之前 handlers_suite_test.go
。我已经对这两个文件进行了一些 log()
调用,不幸的是他们只是证实了我的发现...
这真是令人不快的情况,因为我根本无法进行测试 运行...我需要确保 httptest.Server
和数据库池连接已设置并且 运行在所有规格之前。
你知道如何使 suite_test 到 运行 作为测试规范之前的第一个文件吗?(我已经试过了将套件文件命名为 _suite_test.go
但在这种情况下,套件似乎根本没有执行)。
我的handlers_suite_test.go
:
package handlers_test
import (
"<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.Router
var s *httptest.Server
var serverURL string
func 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()
})
我的cartContensHandler_test.go
:
套餐handlers_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"log"
"net/http"
"strings"
)
var _ = Describe("Handlers/CartContentsHandler", func() {
Describe("Retrieves all available cart content types", func() {
Context("No query string parameters", func() {
var rdr *strings.Reader
var req *http.Request
var res *http.Response
var err error
var url = serverURL + "/cart-contents"
log.Print(url)
It("Makes a GET request", func() {
rdr = strings.NewReader("")
req, err = http.NewRequest("GET", url, rdr)
Expect(err).NotTo(HaveOccurred())
})
It("retrieves a response", func() {
res, err = http.DefaultClient.Do(req)
Expect(err).NotTo(HaveOccurred())
})
It("Returns HTTP 200 OK", func() {
Expect(res.StatusCode).To(BeNumerically("==", http.StatusOK)) // ==> NOW THIS RETURNS 404 as request is to URL without server part
})
})
})
})
在 root 中时,我 运行 以这种方式进行测试:
ginkgo handlers -cover --v
发生的事情是 BeforeSuite
注册了一个将在测试套件之前执行的函数,而 It
注册了一个将成为测试套件一部分的测试函数。 Describe
和 Context
的回调会立即执行。所以你必须把所有依赖于 BeforeSuite
的东西都放到 It
.
为了保证 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() {
# ....
})
})
我正在使用 Ginkgo(和 Gomega)包进行单元测试 Go(lang) Rest API。
我需要使用全局设置,这应该可以通过定义
来实现var _ = BeforeSuite(func() {...})
然后每个规范(具体 <file>_test.go
)应该 运行 在这个全局设置之后。不幸的是我无法做到这一点...
我的套件文件名为 handlers_suite_test.go
,我的第一个测试规范名称为 cartContentsHandler_test.go
。在我看来,Ginkgo 运行s 的测试文件按字母顺序排列,使得 cartContentsHandler_test.go
到 运行 之前 handlers_suite_test.go
。我已经对这两个文件进行了一些 log()
调用,不幸的是他们只是证实了我的发现...
这真是令人不快的情况,因为我根本无法进行测试 运行...我需要确保 httptest.Server
和数据库池连接已设置并且 运行在所有规格之前。
你知道如何使 suite_test 到 运行 作为测试规范之前的第一个文件吗?(我已经试过了将套件文件命名为 _suite_test.go
但在这种情况下,套件似乎根本没有执行)。
我的handlers_suite_test.go
:
package handlers_test
import (
"<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.Router
var s *httptest.Server
var serverURL string
func 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()
})
我的cartContensHandler_test.go
:
套餐handlers_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"log"
"net/http"
"strings"
)
var _ = Describe("Handlers/CartContentsHandler", func() {
Describe("Retrieves all available cart content types", func() {
Context("No query string parameters", func() {
var rdr *strings.Reader
var req *http.Request
var res *http.Response
var err error
var url = serverURL + "/cart-contents"
log.Print(url)
It("Makes a GET request", func() {
rdr = strings.NewReader("")
req, err = http.NewRequest("GET", url, rdr)
Expect(err).NotTo(HaveOccurred())
})
It("retrieves a response", func() {
res, err = http.DefaultClient.Do(req)
Expect(err).NotTo(HaveOccurred())
})
It("Returns HTTP 200 OK", func() {
Expect(res.StatusCode).To(BeNumerically("==", http.StatusOK)) // ==> NOW THIS RETURNS 404 as request is to URL without server part
})
})
})
})
在
ginkgo handlers -cover --v
发生的事情是 BeforeSuite
注册了一个将在测试套件之前执行的函数,而 It
注册了一个将成为测试套件一部分的测试函数。 Describe
和 Context
的回调会立即执行。所以你必须把所有依赖于 BeforeSuite
的东西都放到 It
.
为了保证 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() {
# ....
})
})