gpt4 book ai didi

go - 单元测试时如何包含go模板

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:47 25 4
gpt4 key购买 nike

我正在尝试使用 Gin 在 Go 中测试一个简单的 Web 服务器的实现。 .

该服务有一个端点呈现 HTML。

server.go

// Serve triggers the server initialization
func Serve(addr string) {
if err := serverEngine().Run(addr); err != nil {
log.Fatalf("could not serve on %s: %s", addr, err)
}
}

func serverEngine() *gin.Engine {
eng := gin.Default()

// Register resource handlers
eng.LoadHTMLGlob("tmpl/*")
eng.GET("/", indexHandler)
return eng
}

func indexHandler(c *gin.Context) {
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title": "foo",
})
}

server_test.go

func TestServe(t *testing.T) {
timeOut := time.Duration(3) * time.Second
server := httptest.NewServer(serverEngine())
defer server.Close()

// fixes weird double ':' problem
port := server.URL[len(server.URL)-5:]

_, err := net.DialTimeout("tcp", "localhost:"+port, timeOut)
if err != nil {
t.Errorf("failed to dial server: %s", err)
}
}

当我运行代码时,一切正常。但是在运行单元测试时它会出现以下消息:

--- FAIL: TestServe (0.00s)
panic: html/template: pattern matches no files: `tmpl/*` [recovered]
panic: html/template: pattern matches no files: `tmpl/*`

项目结构:

.
├── main.go
└── server
├── server.go
├── server_test.go
└── tmpl
└── index.tmpl

如何确保 go test 在运行时知道模板位置,以便我可以执行此测试?

最佳答案

编辑:

评论互动后,更新答案匹配目录结构。

gin-test/
├── main.go
└── server
├── server.go
├── server_test.go
└── tmpl
└── index.tmpl

你的 server.go 文件中的函数 serverEngine() 有-

eng.LoadHTMLGlob("tmpl/*")

首先你在根目录中:即 gin-test,run-

# Output:
jeeva@mb-pro:~/go-home/src/gin-test$ go test ./...
? gin-test [no test files]
ok gin-test/server 0.046s

然后你在 gin-test/server 目录/包中:

jeeva@mb-pro:~/go-home/src/gin-test/server$ go test 

#Output:
It would produce the same output as below answer.

我最好的猜测是“问题可能是您的目录结构和文件”以及一些测试用例代码改进。

我刚刚在本地使用以下目录结构尝试了您的代码:

$GOPATH/src/gin-test/
├── server.go
├── server_test.go
└── tmpl
└── index.tmpl

然后,我将您的 TestServe 方法更新为以下内容:

注意:您的测试用例也有效,我刚刚更新以演示 GET 请求和响应。

func TestServe(t *testing.T) {
server := httptest.NewServer(serverEngine())
defer server.Close()

fmt.Println("Server URL:", server.URL)

resp, err := http.Get(server.URL)
body, _ := ioutil.ReadAll(resp.Body)

fmt.Println("Error:", err)
fmt.Println("Response:", string(body))
}

单元测试输出:

jeeva@mb-pro:~/go-home/src/gin-test$ go test
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)

[GIN-debug] Loaded HTML Templates (1):
- index.tmpl

[GIN-debug] GET / --> gin-test.indexHandler (3 handlers)
Server URL: http://127.0.0.1:56989
[GIN] 2017/07/09 - 16:31:16 | 200 | 432.107µs | 127.0.0.1 | GET /
Error: <nil>
Response: <b>I'm here</b>
PASS
ok gin-test 0.104s
jeeva@mb-pro:~/go-home/src/gin-test$

编码愉快!

关于go - 单元测试时如何包含go模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45001750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com