为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
互换的青春 2023-06-05 19:49:36
我有以下生成一些字符串输出的代码:package formatterimport (    "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 graphvizfunc 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"    }}
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

如果你想忽略格式,你可以使用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 是比较两个切片的简单函数。


查看完整回答
反对 回复 2023-06-05
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

最简单的解决方案是在指定预期输出时在测试中使用相同的缩进(与您在模板中使用的相同)。


你有:


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中添加的。


查看完整回答
反对 回复 2023-06-05
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

问题是有一个额外的空间。在那之后的格式化文本中{似乎是你的问题。您可以通过将格式字符串更改为此来修复它


`digraph sitemap {{{range .}}

  "{{.URL}}"

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

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

    }{{end}}

}`


查看完整回答
反对 回复 2023-06-05
  • 3 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信