douliaodan2738 2017-07-09 22:46
浏览 43

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

I'm trying to test an implementation of a simple web server in Go using the Gin.

The service has a single endpoint rendering 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)
    }
}

When I run the code everything works fine. But when running the unit tests it panics with the following message:

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

Project structure:

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

How can I ensure that the go test know about the template location at runtime so I can perform this test?

  • 写回答

1条回答 默认 最新

  • dtdh11647 2017-07-09 23:35
    关注

    EDIT:

    After comment interaction, updating answer match directory structure.

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

    And your server.go file on function serverEngine() has-

    eng.LoadHTMLGlob("tmpl/*")

    First you're in root directory: i.e. 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
    

    Second you're in gin-test/server directory/package:

    jeeva@mb-pro:~/go-home/src/gin-test/server$ go test 
    
    #Output:
    It would produce the same output as below answer.
    

    My best guess is 'problem could be your directory structure and files' and bit of test case code improvements.

    I have just tried your code at my local with following directory structure:

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

    Then, I have updated your TestServe method to following:

    Note: your test case works too, I just updated to demo the GET request and response.

    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))
    }
    

    Unit test output:

    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$
    

    Happy coding!

    评论

报告相同问题?

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加