我正在使用Ginkgo(和Gomega)软件包对单元测试Go(lang)Rest API进行测试。
我需要使用全局设置,这可以通过定义来实现
var _ = BeforeSuite(func() {...})
然后,每个规范(具体<file>_test.go)都应在此全局设置之后运行。不幸的是我无法做到这一点…
<file>_test.go
我的套件文件名为handlers_suite_test.go,第一个测试规范名称为cartContentsHandler_test.go。在我看来,Ginkgo以字母顺序运行测试文件,从而使该文件可以在 之前*cartContentsHandler_test.go运行。我在两个文件中都打了电话,很遗憾他们只是证实了我的发现… *handlers_suite_test.go``log()
handlers_suite_test.go
cartContentsHandler_test.go
handlers_suite_test.go``log()
这真是令人不愉快的情况,因为我根本无法运行测试。我需要确保httptest.Server在所有规范之前都已建立并运行了数据库池连接和数据库池连接。
httptest.Server
您知道如何做才能使suite_test作为测试规格之前的第一个文件运行吗? (我已经尝试将套件文件命名为,_suite_test.go但是在这种情况下,看起来套件甚至根本没有执行)。
_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:
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
It
Describe
Context