gpt4 book ai didi

unit-testing - 如何使用 Go 为 App Engine 指定模板路径以进行单元测试?

转载 作者:IT王子 更新时间:2023-10-29 00:45:05 25 4
gpt4 key购买 nike

我在 App Engine 上使用带有 Go 的内置模板包。

我有一个处理程序可以将模板呈现给输出。

templates := []string{"templates/head.html", "templates/footer.html"}

func pageIndex(w http.ResponseWriter, r *http.Request) {
tpls := append([]string{"templates/index.html"}, templates...)
tpl := template.Must(template.ParseFiles(tpls...))
err := tpl.ExecuteTemplate(w, "index", map[string]string{
"Title": "Index Page",
})

if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}

当我运行本地开发服务器时,一切正常。

当我运行单元测试来测试页面时,它会崩溃并给我消息:

panic: open templates/index.html: no such file or directory [recovered]

单元测试如下:

func TestPageIndex(t *testing.T) {
inst, _ := aetest.NewInstance(nil)
//ignoring the errors for brevity
defer inst.Close()

req, _ := inst.NewRequest("GET", "/", nil)
resp := httptest.NewRecorder()
pageIndex(resp, req)
}

基本上,问题是对于单元测试,服务器无法找到模板的路径。

运行测试时如何指定模板文件的路径?

最佳答案

问题是,当您运行您的应用程序时,例如对于 goapp serve,当前目录是应用根目录(app.yaml 所在的位置)。因此,通常您会提供相对于应用程序根目录的路径。

但是当你运行测试时,例如对于 goapp test,当前目录始终是包含正在运行的测试文件 (*_test.go) 的文件夹。如果测试文件不在应用程序根目录中(通常不在),则正确解析为应用程序根目录的相对路径在解析为另一个文件夹(包含测试文件)时将不起作用。

这里有 2 个选项可以解决您的问题:

1。将工作目录更改为应用根目录

您可以使用 os.Chdir()在调用使用相对路径的代码之前将工作目录更改为应用程序的根文件夹。您甚至可以将其放入 init() 函数中,或从您的测试方法中调用它(以适合您的方式)。

假设您的测试文件位于文件夹中:[APP_ROOT]/my/package/some_test.go。您可以像这样设置应用程序的根目录(在层次结构中向上 2 层):

if err := os.Chdir("../.."); err != nil {
panic(err)
}

请注意,我会在测试文件的包初始化函数中添加这一行,如下所示:

func init() {
if err := os.Chdir("../.."); err != nil {
panic(err)
}
}

因为如果您在测试文件中有多个测试函数,并且您多次运行此代码,结果将不是您想要的结果(正如我们指定的那样从当前上升 2 级)。

2。重构代码

如果您想测试使用相对路径的代码,您可以更改/重构代码以采用相对路径的基础,例如来自测试可能会更改的变量(知道当前目录是它的包含文件夹),以便原始相对路径在从测试运行并解析为不同的基本路径时也将起作用。

例如,当您的应用程序正常运行时,此基本路径可能是空字符串 ""(因此它表示当前文件夹,在本例中为应用程序根目录),以及测试时运行时,您可以将其设置为应用程序的根目录(绝对路径)或类似 "../.." 的目录层次结构中的第 2 级(因为当前目录是测试文件)。

您还可以使相对路径解析到的基本路径更具可配置性,有关详细信息,请参阅此问题:how to reference a relative file from code and tests

关于unit-testing - 如何使用 Go 为 App Engine 指定模板路径以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38320920/

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