如何端到端/集成测试使用反向代理管理子域的Go应用程序?

如何端到端/集成测试使用反向代理管理子域的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中的测试来看,它似乎工作得很好,因为我的所有路由在我的所有子域中都是相同的,所以这样我只能

我有一个使用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,因为这将是一个混乱的设置/维护

编辑:

根据httptest文档,我尝试将foo.localhost硬编码为NewRequest的参数,但它的行为与我需要的行为不符:

NewRequest返回一个新的传入服务器请求,适合传递给http.Handler进行测试

目标是RFC 7230“请求目标”:它可以是路径或绝对URL。如果目标是绝对URL,则使用URL中的主机名。否则,使用“example.com”

当硬编码或foo.localhost.com/api/login作为请求目标时,它会在“foo.localhost.com/api/login”下直接将其传递给我的路由器,而nginx只需直接点击/api/login并从
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”))不正确。非常感谢。