【问题标题】:How to Specify Path of Template for App Engine with Go for Unit Testing?如何使用 Go 为单元测试指定 App Engine 的模板路径?
【发布时间】:2016-11-14 05:25:00
【问题描述】:

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

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

当我运行单元测试来测试页面时,它会出现恐慌并给我消息:

恐慌:打开模板/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)
}

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

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

【问题讨论】:

    标签: unit-testing google-app-engine templates go


    【解决方案1】:

    问题在于,当您运行应用程序时,例如对于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

    【讨论】:

    • 感谢您的回答!有用!我选择使用选项 1,因为每次测试添加一行似乎更容易,而不是修改代码库。
    • @cheeze 请查看编辑后的答案。请注意,我会将其添加到包 init() 函数中,就好像您有多个测试一样,您不应多次运行代码(如果它包含指向当前文件夹的指令而不是绝对路径)。
    • 你是对的——重复调用它是没有意义的。感谢您的来信!
    猜你喜欢
    • 2015-05-04
    • 2011-12-13
    • 2014-10-14
    • 2011-09-19
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多