为了账号安全,请及时绑定邮箱和手机立即绑定

运行 http.ListenAndServe() On Tests using

运行 http.ListenAndServe() On Tests using

Go
www说 2022-10-31 15:56:47
我正在尝试为我使用gorilla/mux、gorm.io和golang-migrate/v4制作的 REST API 应用程序创建集成测试对于我正在使用的测试testify。我SetupSuite()的我integration_Test.go是这样的:func (s *ReceiptServiceTestSuite) SetupSuite() {    s.Require().NoError(godotenv.Load("test.env"))    s.Require().NoError(database.Connect())    s.db = database.DB    s.m = database.M    router.HandleRequests()}而我router.HandleRequests()的是这样的:func HandleRequests() {    router := mux.NewRouter()    router.Use(middleware)    // lots of router.HandleFunc()        http.ListenAndServe(":8080", router)}问题是:如果我router.HandleRequests()从 中删除SetupSuite(),我所有的数据库测试都会正常运行,但是如果我尝试http.ListenAndServe()停止测试工作流并且什么也没有发生。我相信我应该使用 goroutinesrouter.HandleRequests()以便它可以与测试并行运行,我只是不知道该怎么做。有关更多信息,这里是项目存储库,我不知道它是否相关,但我正在运行两个 postgres 实例docker-compose,一个用于运行项目,另一个用于测试。
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

我想出了如何使用 goroutines 来做到这一点。


我读了这个例子,它教如何处理os.Signals使用渠道,我是这样实现的:


首先,我在路由器上进行了以下更改:


func HandleRequests() {

    router := mux.NewRouter()

    router.Use(middleware)

    // lots of router.HandleFunc()

    

    go http.ListenAndServe(":8080", router)


    quit := make(chan os.Signal, 1)

    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)


    <-quit


}

所以现在http.ListenAndServe()正在一个新线程中运行。我相信默认行为会在程序执行结束时停止。


之后http.ListenAndServe(),我创建了一个os.Signalchanel,它将监听来自系统的传入信号(SIGINT 和 SIGTERM),然后该函数将停止在<-quit,它将等待一个信号继续。


然后我修复了我在 goroutineSetupSuite()中运行:router.HandleRequests()


func (s *ReceiptServiceTestSuite) SetupSuite() {

    s.Require().NoError(godotenv.Load("test.env"))

    s.Require().NoError(database.Connect())

    s.db = database.DB

    s.m = database.M


    go router.HandleRequests()

}

在我TearDownSuite()向当前进程发送 SIGTERM 信号时,quit我之前创建的通道将监听该信号,router.HandleRequests()并且该函数将继续终止程序。


func (s *ReceiptServiceTestSuite) TearDownSuite() {

    // some database code 

    p, _ := os.FindProcess(os.Getpid())

    p.Signal(syscall.SIGINT)

}


查看完整回答
反对 回复 2022-10-31
  • 1 回答
  • 0 关注
  • 324 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号