gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:35:38 26 4
gpt4 key购买 nike

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

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"
}
}

下面是对此功能的测试...

package formatter

import (
"testing"

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

func TestDot(t *testing.T) {
input := []mapper.Page{
mapper.Page{
URL: "http://www.example.com/",
Anchors: []string{
"http://www.example.com/foo",
"http://www.example.com/bar",
"http://www.example.com/baz",
},
Links: []string{
"http://www.example.com/foo.css",
"http://www.example.com/bar.css",
"http://www.example.com/baz.css",
},
Scripts: []string{
"http://www.example.com/foo.js",
"http://www.example.com/bar.js",
"http://www.example.com/baz.js",
},
},
}

output := `digraph sitemap {
"http://www.example.com/"
-> {
"http://www.example.com/foo",
"http://www.example.com/bar",
"http://www.example.com/baz"
}
}`

actual := Dot(input)

if actual != output {
t.Errorf("expected: %s\ngot: %s", output, actual)
}
}

失败并出现以下错误(与输出格式间距有关)...

--- FAIL: TestDot (0.00s)
format_test.go:43: expected: digraph sitemap {
"http://www.example.com/"
-> {
"http://www.example.com/foo",
"http://www.example.com/bar",
"http://www.example.com/baz"
}
}
got: digraph sitemap {
"http://www.example.com/"
-> {
"http://www.example.com/foo",
"http://www.example.com/bar",
"http://www.example.com/baz"
}
}

我已经尝试调整我的测试 output 变量,使间距与实际代码的实际输出保持一致。那没有用。

我还尝试在我的输出变量和实际输出的内容上使用 strings.Replace(),奇怪的是我函数的输出(即使它是通过 strings.Replace 仍然是多行的(因此测试会失败)?

为了代码验证,有人知道如何使输出一致吗?

谢谢。

更新

我尝试了@icza 建议的方法,但它仍然没有通过测试,尽管测试中的输出看起来更像预期的那样:

=== RUN   TestDot
--- FAIL: TestDot (0.00s)
format_test.go:65: expected: digraph sitemap {
"http://www.example.com/"
-> {
"http://www.example.com/foo",
"http://www.example.com/bar",
"http://www.example.com/baz"
}
}
got: digraph sitemap {
"http://www.example.com/"
-> {
"http://www.example.com/foo",
"http://www.example.com/bar",
"http://www.example.com/baz"
}
}

最佳答案

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

关于string - 如何让 golang 测试多行输出匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54745108/

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