如何端到端/集成测试使用反向代理管理子域的Go应用程序?
我有一个使用Gin gonic的Go应用程序和一个Nginx反向代理程序,它们将trafic发送到domain.com上的另一个应用程序,并将所有*.domain.com子域流量直接发送到我的Go应用程序 然后,我的Go应用程序有一个中间件,它将从上下文读取nginx传递给它的主机名,并允许我的处理程序知道正在请求哪个子域,并返回所述子域的正确数据和cookie 这是一个非常简单的设置,从我在postman中的测试来看,它似乎工作得很好,因为我的所有路由在我的所有子域中都是相同的,所以这样我只能为所有子域使用一个路由器,而不是每个子域使用一个路由器 现在,当我尝试进行端到端测试时,我的大问题来了 我正在这样设置我的测试:如何端到端/集成测试使用反向代理管理子域的Go应用程序?,go,nginx,testing,integration-testing,Go,Nginx,Testing,Integration Testing,我有一个使用Gin gonic的Go应用程序和一个Nginx反向代理程序,它们将trafic发送到domain.com上的另一个应用程序,并将所有*.domain.com子域流量直接发送到我的Go应用程序 然后,我的Go应用程序有一个中间件,它将从上下文读取nginx传递给它的主机名,并允许我的处理程序知道正在请求哪个子域,并返回所述子域的正确数据和cookie 这是一个非常简单的设置,从我在postman中的测试来看,它似乎工作得很好,因为我的所有路由在我的所有子域中都是相同的,所以这样我只能
router := initRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", "/api/login", bytes.NewBuffer(jsonLogin))
req.Header.Set("Content-Type", "application/json")
router.ServeHTTP(w, req)
assert.Equal(t, 200, w.Code)
使用initRouter()
返回一个gin引擎,加载所有路由和中间件,其余部分作为基本测试设置
显然,测试将失败,因为gin上下文永远不会从上下文接收子域,并且好像一切都来自localhost:8000
有没有办法:
- “Mock”一个子域,以便路由器认为呼叫来自foo.localhost.com而不是localhost
- 设置我的测试套件,以便将测试请求路由到nginx。。我更喜欢解决方案1,因为这将是一个混乱的设置/维护
c.request.Host
编辑2:
我目前正在探索使用以下方法手动设置主机:
req.Header.Set(“Host”、“foo.localhost”)
http.NewRequest返回的请求不适合直接传递给ServeHTTP。改用httptest.NewRequest返回的一个
直接设置:
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestHelloWorld(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.Host != "foobar" {
t.Errorf("Host is %q, want foobar", r.Host)
}
})
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/api/login", nil)
r.Host = "foobar"
mux.ServeHTTP(w, r)
}
嗨,欢迎来到StackOverflow。请你修改一下你的帖子。标题需要是一个问题-我不太了解上下文,无法为您构建它。FTR:如果您没有通过nginx,您很难将其称为端到端测试。True。就我的go应用程序的范围而言,我想这是一个端到端/集成测试?太好了。Works.my语法(req.Header.Set(“Host”、“foo.localhost”))不正确。非常感谢。