Как включить шаблоны go при модульном тестировании

Я пытаюсь протестировать реализацию простого веб-сервера на Go с помощью Gin.

Служба имеет единую конечную точку, отображающую 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 знает о расположении шаблона во время выполнения, чтобы я мог выполнить этот тест?


person Alessandro Resta    schedule 09.07.2017    source источник


Ответы (1)


ИЗМЕНИТЬ:

После взаимодействия с комментарием обновляется структура каталогов соответствия ответов.

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

И ваш файл server.go в функции serverEngine() имеет-

eng.LoadHTMLGlob("tmpl/*")

Сначала вы находитесь в корневом каталоге: например, gin-test, запустите-

# 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$

Удачного кодирования!

person jeevatkm    schedule 09.07.2017
comment
На моем server.go у меня есть eng := gin.Default() eng.LoadHTMLGlob("tmpl/*") Если я перемещаю шаблон из корневого каталога проекта внутрь папки сервера, он проходит тест, но терпит неудачу, когда я пытаюсь запустить программу. Неважно, если я изменю eng.LoadHTMLGlob("tmpl/*") на server/tmpl/* - person Alessandro Resta; 10.07.2017
comment
comment
Не могли бы вы обновить структуру каталогов в вопросе? Обычно исходный файл Go и тестовый файл находятся в одном каталоге. Когда вы передаете tmpl/* этот шаблон, это означает, что он относится к текущему каталогу. Я не могу сказать, что сообщение SO, которым вы поделились, связано с вашей проблемой. - person jeevatkm; 10.07.2017
comment
В соответствии с вашим тестом структуры каталогов будет работать правильно. Я обновляю ответ, чтобы узнать подробности. - person jeevatkm; 10.07.2017
comment
@AlessandroResta У вас была возможность посмотреть обновления ответов? - person jeevatkm; 10.07.2017