我将内置模板包与Go on App Engine一起使用。
我有一个将模板呈现到输出的处理程序。
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)
}
}
当我运行本地开发服务器时,它工作正常。
当我运行单元测试来测试页面时,它会慌张并给出以下消息:
恐慌:打开templates / index.html:没有此类文件或目录[已恢复]
单元测试如下:
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个选择:
您可以os.Chdir()
在调用使用相对路径的代码之前将工作目录更改为应用程序的根文件夹。您甚至可以将其放入init()
函数中,或从测试方法中调用它(以适合您的方式)。
假设您的测试文件位于文件夹中[APP_ROOT]/my/package/some_test.go
。您可以这样设置应用程序的根目录(在层次结构中为2级):
if err := os.Chdir("../.."); err != nil {
panic(err)
}
请注意,我会在测试文件的package init函数中添加此行,如下所示:
func init() {
if err := os.Chdir("../.."); err != nil {
panic(err)
}
}
因为如果您在测试文件中具有多个测试功能,并且多次运行此代码,则结果将不是您想要的(因为我们指定从当前级别升2个级别)。
如果您要测试使用相对路径的代码,则可以更改/重构代码以使用相对路径的基础,例如从测试可能会更改的变量中获取(知道当前目录是其包含文件夹的位置),以便原始相对路径从测试运行并解析为其他基本路径时,也可以使用。
例如,""
当您的应用正常运行时,此基本路径可能是空字符串(因此,这意味着当前文件夹是本应用的根目录),而在测试运行时,您可以将其设置为应用的根目录(绝对值)路径)或类似"../.."
第2步的操作在目录层次结构中进行升级(因为当前目录是测试文件的包含文件夹)。
问题内容: 人们如何在基于Go的AppEngine应用程序中处理模板的使用? 具体来说,我正在寻找一个具有以下功能的项目结构: 模板和部分模板的分层(目录)结构 请允许我在模板上使用HTML工具/编辑器(在xxx.go文件中嵌入模板文本使此操作很困难) 在开发服务器上时自动重新加载模板文本 潜在的绊脚石是: template.ParseGlob()不会递归遍历。 出于性能原因,建议不要将模板作为原
英文原文: http://emberjs.com/guides/routing/specifying-a-routes-model/ 指定路由的模型 应用中的模板背后是由模型来支撑的。那么模板是如何知道需要显示哪些模型的呢? 例如,如果有一个photos模板,那么它是如何知道应该渲染哪一个模型的呢? 这正是Ember.Route的工作之一。通过定义一个与模板同名的,并实现其model方法的路由,是
本文向大家介绍Angular 2 更改路线(使用模板和指令),包括了Angular 2 更改路线(使用模板和指令)的使用技巧和注意事项,需要的朋友参考一下 示例 现在已经设置了路由,我们需要一些方法来实际更改路由。 此示例将显示如何使用模板更改路由,但是可以在TypeScript中更改路由。 这是一个示例(无绑定): 如果用户单击该链接,它将链接到/home。路由器知道如何处理/home,因此它将
我以为是:
使用,我在基本模板中定义了一个,其中包含默认内容。在某些情况下,我希望这个块为空,所以我想我可以重新定义它的名称,并使它不包含以下内容: 不知何故,Go似乎认为这个定义是“零”,并且仍然会呈现默认内容,除非我将任何非空白内容放入定义中。 我在Golang repo上发现了这个问题,它在一个游乐场示例中很好地描述了同样的事情: 奇怪的是,这个问题提到它是固定的(如果我理解正确的话,它在1.8.1中着
问题内容: 我使用脚本来构建我的项目。我希望能够从其他目录运行脚本。也就是说,不要执行以下操作: …我只想做类似的事情: 要么 这可能吗? 问题答案: 使用对我有用: 哪里是你的所在目录 的package.json 与定义的命令。