如何让 golang 测试多行输出匹配

我有以下生成一些字符串输出的代码:


package formatter


import (

    "bytes"

    "log"

    "text/template"


    "github.com/foo/bar/internal/mapper"

)


// map of template functions that enable us to identify the final item within a

// collection being iterated over.

var fns = template.FuncMap{

    "plus1": func(x int) int {

        return x + 1

    },

}


// Dot renders our results in dot format for use with graphviz

func Dot(results []mapper.Page) string {

    dotTmpl := `digraph sitemap { {{range .}}

  "{{.URL}}"

    -> { {{$n := len .Anchors}}{{range  $i, $v := .Anchors}}

      "{{.}}"{{if eq (plus1 $i) $n}}{{else}},{{end}}{{end}}

    } {{end}}

}`


    tmpl, err := template.New("digraph").Funcs(fns).Parse(dotTmpl)

    if err != nil {

        log.Fatal(err)

    }


    var output bytes.Buffer

    if err := tmpl.Execute(&output, results); err != nil {

        log.Fatal(err)

    }


    return output.String()

}

它生成如下输出:


digraph sitemap {

  "http://www.example.com/"

    -> {

      "http://www.example.com/foo",

      "http://www.example.com/bar",

      "http://www.example.com/baz"

    }

}


互换的青春
浏览 163回答 3
3回答

慕盖茨4494581

如果你想忽略格式,你可以使用strings.Fields.output := strings.Fields(`digraph sitemap {  "http://www.example.com/"      -> {          "http://www.example.com/foo",          "http://www.example.com/bar",          "http://www.example.com/baz"  }}`)actual := strings.Fields(Dot(input))if !equal(output,actual) {    // ...}其中 equal 是比较两个切片的简单函数。

Cats萌萌

最简单的解决方案是在指定预期输出时在测试中使用相同的缩进(与您在模板中使用的相同)。你有:output := `digraph sitemap {  "http://www.example.com/"      -> {          "http://www.example.com/foo",          "http://www.example.com/bar",          "http://www.example.com/baz"  }}`将其更改为:    output := `digraph sitemap {  "http://www.example.com/"    -> {      "http://www.example.com/foo",      "http://www.example.com/bar",      "http://www.example.com/baz"    }}`请注意,例如,最后一行没有缩进。当您使用原始字符串文字时,包括缩进字符在内的每个字符都是原样文字的一部分。创建正确的、未缩进的原始字符串文字的步骤毕竟,这完全是一个非编码问题,而是编辑器自动格式化和定义原始字符串文字的问题。一种简单的正确方法是首先编写一个空的原始字符串文字,向其添加一个空行并清除编辑器插入的自动缩进:    output := ``当你有这个时,在结束反引号之前复制粘贴正确的输入,例如:    output := `digraph sitemap {  "http://www.example.com/"    -> {      "http://www.example.com/foo",      "http://www.example.com/bar",      "http://www.example.com/baz"    }}`最后一步,从原始字符串文字的第一行删除换行符,您将获得正确的原始字符串文字:    output := `digraph sitemap {  "http://www.example.com/"    -> {      "http://www.example.com/foo",      "http://www.example.com/bar",      "http://www.example.com/baz"    }}`一旦你有了这个,gofmt编辑器的运行或自动格式化就不会再混乱了。更新:我检查了你更新的测试结果,在你得到的结果中,第一行之后有一个空格:digraph sitemap {,第三行之后也有一个空格:-> {,但是你没有将它们添加到你的预期输出中。也可以将它们添加到您的预期输出中,或者从模板中删除这些空格!比较字符串时,它们是按字节比较的,每个字符(包括空格)都很重要。要从模板中删除这些额外的空格:    dotTmpl := `digraph sitemap { {{- range .}}  "{{.URL}}"    -> { {{- $n := len .Anchors}}{{range  $i, $v := .Anchors}}      "{{.}}"{{if eq (plus1 $i) $n}}{{else}},{{end}}{{end}}    } {{end}}}`注意使用{{-。这是为了修剪模板操作周围的空间,这是在Go 1.6中添加的。

幕布斯6054654

问题是有一个额外的空间。在那之后的格式化文本中{似乎是你的问题。您可以通过将格式字符串更改为此来修复它`digraph sitemap {{{range .}}  "{{.URL}}"    -> {{{$n := len .Anchors}}{{range  $i, $v := .Anchors}}      "{{.}}"{{if eq (plus1 $i) $n}}{{else}},{{end}}{{end}}    }{{end}}}`
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go